2014-02-14 3 views
2

я не могу не удивляться ...правила неопределенные переменные и обзорных

Config:

[email protected]:~/$ python --version 
Python 2.7.5+ 

Код:

import logging 
logger = logging.getLogger('x') 

def main(): 
    print logger 
    logger = 2 

if __name__ == "__main__": 
    main() 

Выход:

[email protected]:~/$ python ./manager.py 
Traceback (most recent call last): 
    File "./manager.py", line 9, in <module> 
    main() 
File "./manager.py", line 5, in main 
    print logger 
UnboundLocalError: local variable 'logger' referenced before assignment 

Очевидно , Я бы ожидал, что заявление печати для доступа к glob измененная логическая переменная. Есть ли что-то, что я не понял о правилах определения переменных переменной python?

Кроме того, очевидно, что оператор logger = 2 не должен делать многого. Однако, если я удалю его, исключение неопределенной переменной исчезнет.

+0

Вы назначаете имя => локальное. –

+1

«Есть ли что-то, что я не понимал в правилах определения переменных переменной python?» Да. Вы не понимаете, что у вас могут быть локальные переменные с тем же именем, что и переменные, объявленные в глобальной области. Если вы хотите использовать переменную в глобальной области видимости, вам нужно сказать следующее: 'def main(): глобальный журнал; регистратор печати; logger = 2' – hughdbrown

+0

Это должно быть 'global logger'. Сожалею. – hughdbrown

ответ

1

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

Как только вы хотите переопределить его или изменить его в любом случае, вам необходимо четко указать, какое имя вы говорите.

>>> a = 'hello' 
>>> def f(): 
... print(a) 
... 
>>> def f2(): 
... global a 
... a = 'world' 
... print(a) 
... 
>>> f() 
hello 
>>> f2() 
world 
>>> a 
'world' 
Смежные вопросы