在Python中声明了哪些liveth全局变量但未定义全局变量?
问题描述:
当你声明一个变量是全局变量时,它不会为你创建它(如果它不存在的话)。全球声明实际上对变量做了什么?它显然不仅仅是修改它,因为它不需要修改它。一旦超出范围,可以在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对象等待创建具有给定名称的对象,并在函数结束时被清除?
答
全局陈述实际上做的变量是什么?
绝对没有。
global foo
意味着在函数范围内变量名称foo
的任何出现都指代模块全局foo
变量而不是函数调用局部变量。它对变量本身没有任何影响。
至于这些变量存在的地方,他们并不真正“活”在任何地方。当这样的变量被赋值时,将在模块的全局变量dict中为它们创建一个条目。如果变量为del
eted,全局变量dict条目将被删除。这与如果您正在分配并且在模块级别使用这些变量而没有声明global
会发生什么相同。
答
全局是解析器的指令。
写在doc。这意味着它不会改变任何东西。另请注意,“它仅适用于与全局语句同时分析的代码”。这可以在下面的例子中
a=3
def foo():
exec('global a')
a=4
foo()
print(a) # 3
测试如果global
是修改如你所说,那么最后一行将打印4.但事实并非如此。
对,但在给狗分配值之前,没有狗的情况。 – Goodies
我的观点是,它显然不是直接修改狗,因为狗在全球声明之前并不存在。你不能修改不存在的东西。 – Goodies
垃圾回收器与它无关。 'global'只是不创建变量。如果你在'foo()'中的globals()'中检查'“cat”,它将会回答false。 – gdlmx