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是全局可访问的。
当一个变量在等号的左侧时,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)
Python 通过绑定操作确定范围。赋值是一种绑定操作,就像导入一样,使用名称作为中的目标except .. as,with .. as或for循环,或通过创建函数或类。
当名称绑定在范围内时,该名称在该范围内是本地的。如果使用但不限制名称,则该名称是非本地的;编译器将在编译时确定范围应该是什么。在您的情况下,除全局作用域外没有父作用域,因此任何未绑定的名称都被视为全局名称。
由于第二个示例绑定到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应该是全局的,即使您绑定了它也是如此。
| 归档时间: |
|
| 查看次数: |
1360 次 |
| 最近记录: |