全局语句与同一块中的名称绑定操作具有相同的范围。
如果自由变量的最近封闭范围包含全局语句,则将自由变量视为全局变量。
这两句话是什么意思?
你能举例说明一下它们的含义吗?
感谢。
答案 0 :(得分:7)
全局语句与同一块中的名称绑定操作具有相同的范围。
这表示适用global
语句的位置。
基本上,在正常情况下,当你这样做时:
foo = 1
在函数内部,它使foo
成为该函数的本地范围变量;即使名称仅在函数末尾指定,它从一开始就是本地名称,但在分配时它不会从全局切换到本地。
同样,如果您的功能包括以下行:
global foo
即使foo
是函数中的最后一行,它也会使整个函数成为global foo
全局。
重要的是,你在这个功能中的位置并不重要。就像:
def x():
print(y)
y = 1
引发UnboundLocalError
(因为分配给y
使其成为函数的整个范围的本地,并在给它一个值之前打印它),执行:
y = 0
def x():
print(y)
y = 1
global y
将在第一行打印y
的全局值(第一次调用为0,第二次调用为1)而不会出错(而不是提升UnboundLocalError
或其他内容),因为{{1} }语句总是适用于它们实际出现之前和之后的整个函数,就像局部变量在函数的整个范围内是局部变量一样,即使它们仅在最后分配。请注意,现代Python确实在关联的global
语句之前使用全局名称引发SyntaxWarning
,因此最好先将global
语句放在第一位,以便清晰起见并避免出现警告。
关于嵌套范围的部分:
如果自由变量的最近封闭范围包含全局语句,则将自由变量视为全局变量。
使用多个嵌套作用域覆盖了一个非常不寻常的角落案例,其中外部作用域分配给局部变量,一个作用域内的作用域声明了名称global
,并且该作用域内的作用域使用了(但没有' t)指定名称。简短的定义是"如果您正在寻找变量来读取不在本地范围内的变量,那么当您查看它的外部范围时,如果它在其中一个中是全局的,停止检查嵌套范围并直接进入全局范围"。这个例子最简单:
global
使用此定义,执行foo = 1
def outermost():
def middle():
global foo # Stops scope checking, skips straight to global
def innermost():
print(foo)
return innermost
foo = 2 # Doesn't change global foo
return middle
将输出outermost()()()
,因为1
中的范围查找检查innermost
,确定middle
是foo
的全局1}}范围,并跳过检查middle
直接转到全局outermost
。
如果您有:
foo
然后输出为foo = 1
def outermost():
def middle():
# No global declaration
def innermost():
print(foo)
return innermost
foo = 2 # Doesn't change global foo
return middle
; 2
中的foo
查找无法在本地或innermost
的范围内找到,但会在middle
的范围内找到它从那里拉出来。它非常你不太可能看到这样的结构,但语言文档必须尽可能明确。