Python全局变量/作用域混淆

Vad*_*ico 2 python scope global-variables jes

我已经开始自学python,并且注意到与全局变量和范围有关的某些奇怪事情。当我运行这个:

x = 2 
y = 3 
z=17 
def add_nums():
    y = 6 
    return z+y
Run Code Online (Sandbox Code Playgroud)

打印结果为23 ...但是,当我将返回值扩展为:

x = 2 
y = 3 
z=17 
def add_nums(): 
    y = 6 
    z = z + y 
    return z
Run Code Online (Sandbox Code Playgroud)

我在第6行收到以下错误:

Local name referenced but not bound to a value.
A local name was used before it was created. You need to define the     
method or variable before you try to use it.
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么我在这里遇到错误,因为z是全局可访问的。

Joã*_*tes 6

当一个变量在等号的左侧时,python 将创建一个局部变量。当变量位于等号的右侧时,python 将尝试查找局部变量,如果找不到,它将使用全局变量。在您的示例中, z 位于等号的右侧和左侧,以避免歧义 python 引发错误。您需要使用global语法来避免这种情况:

x = 2 
y = 3 
z=17 
def add_nums(): 
    global z
    y = 6 
    z = z + y 
    return z
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 5

Python 通过绑定操作确定范围。赋值是一种绑定操作,就像导入一样,使用名称作为中的目标except .. aswith .. asfor循环,或通过创建函数或类。

当名称绑定在范围内时,该名称在该范围内是本地的。如果使用但不限制名称,则该名称是非本地的;编译器将在编译时确定范围应该是什么。在您的情况下,除全局作用域外没有父作用域,因此任何未绑定的名称都被视为全局名称。

由于第二个示例绑定到z(您使用z =,是一个赋值),因此该名称对于该函数而言是本地的。

如果名称绑定到范围中,但您想告诉Python无论如何它应该是全局的,则需要明确地这样做:

x = 2 
y = 3 
z=17 
def add_nums(): 
    global z
    y = 6 
    z = z + y 
    return z
Run Code Online (Sandbox Code Playgroud)

global z行告诉编译器z应该是全局的,即使您绑定了它也是如此