Почему int и dict ведут себя по-разному во вложенных функциях?

Это мой код:

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?


person blueFast    schedule 26.09.2014    source источник
comment
Вы перепривязываете x к новому значению. x += 1 для неизменного x должен привязать x к новому значению. x += something для изменяемого значения по-прежнему будет перепривязываться, но может потенциально изменить изменяемый объект на месте. d['a'] = x не привязывает имя d ни к чему другому, он изменяет объект, на который ссылается d. d по-прежнему указывает на словарь, только d['a'] изменяется, чтобы добавить новый ключ или обновить существующий ключ, чтобы он ссылался на то, на что ссылается x.   -  person Martijn Pieters    schedule 26.09.2014