2014-12-10 2 views
0

Я получаю UnboundLocalError: локальная переменная, на которую ссылается перед ошибкой присваивания при попытке запустить этот код. Согласно правилу LEGB это должно работать нормально.Получение UnboundLocalError: локальная переменная, на которую ссылаются до ошибки присваивания

def xyz(): 
    count = 1 
    def xyz_inner(): 
     count += 1 
     print count 
    xyz_inner() 
    print count 
+1

http://eli.thegreenplace.net/2011/05/15/understanding-unboundlocalerror-in-python Я уверен, что есть где-то дубликат здесь – jamylak

+0

какая у вас версия python? – Kasramvd

+0

возможно дубликат [UnboundLocalError в Python] (http://stackoverflow.com/questions/9264763/unboundlocalerror-in-python) – fredtantini

ответ

0

см unbound local error

def xyz(): 
    count = 1 
    def xyz_inner(): 
     count += 1 
     print count, locals() 
    xyz_inner() 
    print count 

print hasattr(globals, 'count') 
print hasattr(xyz, 'count') 

>>> 
False 
False 

Определить переменную в любом изменяемый объект, как dict или list (использует ту же ссылку) и обновить его с помощью дополненной назначения.

это работает: -

def xyz(): 
    count = {'value': 1} 
    def xyz_inner(): 
     count['value'] += 1 
     print count['value'], 
    xyz_inner() 
    print count 

xyz() 

см python closure for nonlocal in python2.7

+0

Обратите внимание, что оператор 'print hasattr (xyz, 'count')' сообщает вам, что _function_ не имеет атрибута 'count'. Это, однако, не то же самое, что локальное пространство имен функций, содержащее имя 'count'. Атрибуты функции полностью отделены от пространства имен вызовов. – holdenweb

1

Проблема здесь в том, что count во внутренней функции связана с (дополненная) оператора присваивания, и поэтому рассматривается как локальная для xyz_inner(). Следовательно, при первом попытке кода выполнить count += 1 (локальная) переменная count ранее не была назначена, и поэтому она действительно является несвязанной локалью.

Использование nonlocal count внутри xyz_inner() должен исправить эту проблему, говоря интерпретатор, который вы хотите использовать xyz() «s count, а не создавать местные.

+0

Спасибо за ответ Теперь я изменил мой код Защиты хуга(): \t Количества = 1 \t защиту xyz_inner(): \t \t глобальный граф \t \t счетчик + = 1 печать Количество \t xyz_inner() \t Количество печати Это теперь дает NameError: глобальное имя 'подсчет' не определен однако в соответствии с моим недоукомплектованием, поскольку счет был определен в приложении, поэтому эта ошибка не должна появляться –

+0

К сожалению, 'global' означает« в пространстве имен модуля »не« в пространстве имен лексически окружающих функций », поэтому мое предложение использовать« нелокальное '. К сожалению, я забыл, что это функция Python 3. Остерегайтесь использования глобалов для межкомпонентной связи. Это действительно испортило сплоченность вашего программного обеспечения. – holdenweb

Смежные вопросы