2016-06-07 2 views
0

Когда вы указываете, что переменная является глобальной, она не создает ее для вас (если она еще не существует). Что делает глобальный оператор на самом деле делать с переменной? Очевидно, он не просто модифицирует его, поскольку он не должен существовать для его модификации. После того, как это выходит из области видимости, можетГде живут объявленные, но неопределенные глобальные переменные в Python?

def foo(): 
    global cat, dog 
    dog = 1 

foo() 
print('dog' in globals()) # => True 
print(dog) # => 1 
print('cat' in globals()) # => False 
print(cat) # => NameError 

Это также вызывает ошибку (не удивительно):

def foo(): 
    global cat, dog 
    dog = 1 

def bar(): 
    cat = 2 

foo() 
bar() 
print(dog) 
print(cat) # => NameError 

Так, очевидно, глобальный модификатор работает только в пределах области видимости функции выполняется. Это, в любом случае, вызвано сборщиком мусора? Есть ли какой-то фантомный объект глобализатора, который ждет создания объекта с заданным именем и будет очищен в конце функции?

+0

Правильно, но до назначения собаки на значение не было никаких случаев собаки. – Goodies

+0

Моя точка зрения заключается в том, что она явно не модифицирует собаку, потому что собака не существует до глобального утверждения. Вы не можете изменить то, что не существует. – Goodies

+0

Сборщик мусора не имеет к этому никакого отношения. 'global' просто не создает переменную. Если вы проверите '' cat 'в globals() 'внутри' foo() ', он ответит false. – gdlmx

ответ

2

Что делает глобальное заявление Фактически делать с переменной?

Абсолютно ничего.

global foo означает, что любые вхождения имени переменной foo в области видимости функции относятся к модулю глобального foo переменной вместо переменной функции вызова локальной. Он ничего не делает для самой переменной.

Что касается таких переменных, то они не живут «никуда». Когда такая переменная назначается, для них будет создана запись в глобальной переменной модуля dict. Если переменная равна del eted, запись глобальной переменной dict будет удалена. Это идентично тому, что было бы, если бы вы назначали, и del, используя эти переменные на уровне модуля без объявления global.

1

Глобальный - это директива для синтаксического анализатора.

как написано в doc. Это означает, что это ничего не меняет. Также обратите внимание, что «это относится только к анализу кода одновременно с глобальным утверждением». Это можно проверить в приведенном ниже примере

a=3 
def foo(): 
    exec('global a') 
    a=4 

foo() 
print(a) # 3 

Если global является модификатором, как вы сказали, то последняя строка напечатает 4. Но это не так.

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