liveth声明但在Python中未定义的全局变量?

时间:2016-06-07 22:42:56

标签: python cpython

当您声明变量是全局变量时,它不会为您创建变量(如果它尚不存在)。全局声明实际对变量做了什么?它显然不仅仅是修改它,因为它不必存在以便修改它。一旦超出范围,可以

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

显然,全局修饰符只能在正在执行的函数范围内工作。这是垃圾收集器造成的吗?是否有一些幻像全局化器对象等待创建具有给定名称的对象并在函数结束时被清除?

2 个答案:

答案 0 :(得分:2)

  

全局声明实际对变量做了什么?

绝对没有。

global foo表示函数范围内出现的任何变量名foo都是指模块全局foo变量而不是函数调用局部变量。它对变量本身没有任何作用。

至于这些变量存在的地方,它们并不真正“活”在任何地方。分配这样的变量时,将在模块的全局变量dict中为它们创建一个条目。如果变量为del,则全局变量dict条目将被删除。这与在没有del声明的情况下在模块级别分配和global这些变量时会发生的情况相同。

答案 1 :(得分:1)

  

global是解析器的指令。

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

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

foo()
print(a) # 3

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