2015-07-23 3 views
1

На SaltyCraneBlog (http://www.saltycrane.com/blog/2008/01/python-variable-scope-notes/#c7900), я читал на переменной сферы в Python и все было довольно просто, пока я не получил этот обходной путь для установки глобальных переменных:Python Variable Scope и .var

def ex8(): 
    ex8.var = 'foo' 
    def inner(): 
     ex8.var = 'bar' 
     print 'inside inner, ex8.var is ', ex8.var 
    inner() 
    print 'inside outer function, ex8.var is ', ex8.var 
ex8() 

То, что меня выбрасывает, это часть ex8.var. Это атрибут? Если var является атрибутом ex8, не нужно ли сначала определять var var? Можно ли вызывать атрибуты функции внутри самой функции?

ответ

1

Что меня выбрасывает, это часть ex8.var. Это атрибут?

Да.

Если var является атрибутом ex8, не нужно ли сначала определять var var?

Нет. Вы можете устанавливать атрибуты объектов в любое время, не указывая на них (если объект не определяет специальное поведение, препятствующее вам это делать).

Может ли атрибут функции вызываться внутри самой функции?

Да, функции функции могут быть доступны изнутри функции. Функция представляет собой объект, подобный другому, и вы можете получить доступ к его атрибутам, как вы можете, для любого другого объекта, доступного в текущей области. (Атрибут здесь не называется, поскольку его значение не является функцией, это просто значение, к которому вы обращаетесь.)

В комментарии, который вы указали к упоминанию, что этот код делает, не обязательно хорошо делать. Как упоминается в этом сообщении в блоге, Python 3 включает ключевое слово nonlocal, которое устраняет необходимость в таком хакерстве. Даже в Python 2 нередко приходится находить себя в ситуации, когда вам нужно прибегать к таким трюкам.