囲み関数で定義されたリストを変異させることによって、期待どおり下記(不合理なく例示)コードが動作する:オブジェクトの変更がPythonのスコープ上でどのような影響を与えますか?
def outside1():
l = list('abcd')
def inside(a):
print "Before - %i: %r" % (id(l), l)
l.append(a)
print "After - %i: %r\n" % (id(l), l)
return inside
f = outside1()
[f(c) for c in 'efgh']
このコードはまた囲む範囲で定義された不変で囲まれた範囲内でアクセス可能であることを示す動作します。
def outside2():
t = tuple('abcd')
def inside():
print "%i: %r" % (id(t), t)
return inside
outside2()()
しかしこれはlocal variable 't' referenced before assignment
で失敗します。
def outside3():
t = tuple('abcd')
def inside(a):
print "Before - %i: %r" % (id(t), t)
t = t + (a,)
print "After - %i: %r\n" % (id(t), t)
return inside
f = outside3()
[f(c) for c in 'efgh']
ことができる人の電子ここで何が起こっているの?私の最初の推測では、私は突然変異することができますが、囲みスコープに割り当てることはできませんでしたが、の前にのprint文がoutside2
の働きをする前に動作すると予想していました。
"コンパイル中にPythonが名前のスコープを静的に検出しました。"ありがとう、それは簡単な答えです。 py3kのチップは素晴らしいボーナスです。 – Finn