Следующий (абсурдный, но иллюстративный) код работает, как и ожидалось, изменяя список, определенный в функции включения:
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']
Может кто-нибудь объяснить, что здесь происходит? Моим первым предположением было то, что я могу видоизмениться, но не назначить для охватывающей области, но я бы по крайней мере ожидал, что оператор печати до сработает, учитывая, что outside2
работает.