x = 1
def fn():
print x
fn()
打印“1”:
x = 1
def fn():
x += 1
print x
fn()
这会引发“UnboundLocalError:在赋值之前引用的局部变量'x'”
这里发生了什么?
答案 0 :(得分:4)
在Python中,分配给变量也是一个隐式本地声明,在字节码编译期间解析。所以
x += 1
将创建一个局部变量x
并编译为此字节代码:
0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (1)
6 INPLACE_ADD
7 STORE_FAST 0 (x)
命令LOAD_FAST
将尝试加载尚未定义的局部变量x
,以及它失败的原因。
但是,如果您明确将x
定义为global
,则会改为使用LOAD_GLOBAL
/ STORE_GLOBAL
。
在第一个函数中print
的情况下,编译器假定因为在函数体中没有声明(赋值)局部变量,所以你应该指一个全局变量。
答案 1 :(得分:2)
在函数内的任何位置分配名称的行为仅使该名称为本地名称。
答案 2 :(得分:1)
您正在使用local
变量,一个不同的绑定,而不是全局。
范围定义块中名称的可见性。如果是当地的 变量在块中定义,其范围包括该块。如果 定义发生在功能块中,范围扩展到任何块 包含在定义的内容中,除非包含的块引入 名称的不同绑定
答案 3 :(得分:0)
因为你必须在函数中添加global x
:
def fn():
global x
x += 1
print x
这告诉解释器您打算修改全局变量。 This is not necessary for certain objects类似可变序列(例如list
)。