全球声明的范围

时间:2017-07-12 21:46:09

标签: python python-3.x

来自Python Reference

  

全局语句与同一块中的名称绑定操作具有相同的范围。

     

如果自由变量的最近封闭范围包含全局语句,则将自由变量视为全局变量。

这两句话是什么意思?

你能举例说明一下它们的含义吗?

感谢。

1 个答案:

答案 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,确定middlefoo的全局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的范围内找到它从那里拉出来。它非常你不太可能看到这样的结构,但语言文档必须尽可能明确。