Это мой код:
def outer():
x = 0
d = { 'a' : 'b' }
def inner():
for _ in xrange(10):
x += 1
d['a'] = x
yield x
for y in inner():
print y
print "%d rounds" % (x)
outer()
Который дает:
Traceback (most recent call last):
File "xxx.py", line 14, in <module>
outer()
File "xxx.py", line 11, in outer
for y in inner():
File "xxx.py", line 8, in inner
x += 1
UnboundLocalError: local variable 'x' referenced before assignment
Если я определяю x
локально в inner
, проблема исчезает. Другими словами: inner
не может изменить целое число, определенное извне, но может изменить словарь. Я предполагаю, что это связано с тем, что для назначения x
требуется доступ для чтения/записи к нему, но для назначения словаря не требуется доступ для чтения/записи к словарю: обновление выполняется для элемента словаря?
Как реализовать inner
, чтобы иметь доступ и изменять переменную x
, определенную outer
?
x
к новому значению.x += 1
для неизменногоx
должен привязатьx
к новому значению.x += something
для изменяемого значения по-прежнему будет перепривязываться, но может потенциально изменить изменяемый объект на месте.d['a'] = x
не привязывает имяd
ни к чему другому, он изменяет объект, на который ссылаетсяd
.d
по-прежнему указывает на словарь, толькоd['a']
изменяется, чтобы добавить новый ключ или обновить существующий ключ, чтобы он ссылался на то, на что ссылаетсяx
. - person Martijn Pieters   schedule 26.09.2014