2016-06-07 80 views
0

当你声明一个变量是全局变量时,它不会为你创建它(如果它不存在的话)。全球声明实际上对变量做了什么?它显然不仅仅是修改它,因为它不需要修改它。一旦超出范围,可以在Python中声明了哪些liveth全局变量但未定义全局变量?

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 

所以,很显然,全球仅修改函数的范围内工作的执行。这是否是由垃圾收集器造成的?是否有一些幻像的globalizer对象等待创建具有给定名称的对象,并在函数结束时被清除?

+0

对,但在给狗分配值之前,没有狗的情况。 – Goodies

+0

我的观点是,它显然不是直接修改狗,因为狗在全球声明之前并不存在。你不能修改不存在的东西。 – Goodies

+0

垃圾回收器与它无关。 'global'只是不创建变量。如果你在'foo()'中的globals()'中检查'“cat”,它将会回答false。 – gdlmx

回答

2

全局陈述实际上做的变量是什么?

绝对没有。

global foo意味着在函数范围内变量名称foo的任何出现都指代模块全局foo变量而不是函数调用局部变量。它对变量本身没有任何影响。

至于这些变量存在的地方,他们并不真正“活”在任何地方。当这样的变量被赋值时,将在模块的全局变量dict中为它们创建一个条目。如果变量为del eted,全局变量dict条目将被删除。这与如果您正在分配并且在模块级别使用这些变量而没有声明global会发生什么相同。

1

全局是解析器的指令。

写在doc。这意味着它不会改变任何东西。另请注意,“它仅适用于与全局语句同时分析的代码”。这可以在下面的例子中

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

foo() 
print(a) # 3 

测试如果global是修改如你所说,那么最后一行将打印4.但事实并非如此。