当您声明变量是全局变量时,它不会为您创建变量(如果它尚不存在)。全局声明实际对变量做了什么?它显然不仅仅是修改它,因为它不必存在以便修改它。一旦超出范围,可以
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 :(得分: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.但事实并非如此。