Python中UnboundLocalError报错原因及代码运行差异咨询
Python局部变量绑定引发的UnboundLocalError问题解析
先看三段代码的不同表现:
报错的代码
p="hello" def z(): if p == "hello": p="2" print(p) z()
运行报错:UnboundLocalError: local variable 'p' referenced before assignment
正常运行的代码1
p="hello" def z(): p="2" print(p) z()
输出:"2"
正常运行的代码2
p="hello" def z(): if p == "hello": x="2" print(x) z()
输出:2
原因分析
Python函数在编译阶段会扫描内部的变量赋值操作:只要函数内存在对某个变量的赋值语句(不管这个语句是否会被执行),Python就会将该变量标记为局部变量,不再去引用同名的全局变量。
- 第一段代码中,函数
z内部有p="2"的赋值,所以p被标记为局部变量。但if p == "hello"这行代码在局部变量p赋值前就去引用它,直接触发报错。 - 第二段代码中,函数
z一开始就给局部变量p赋值,后续打印时变量已经有值,自然正常运行。 - 第三段代码中,函数
z内部没有对p的赋值,所以p会引用全局的p;而x是函数内定义的局部变量,且在打印前完成了赋值,因此也能正常执行。
解决办法
如果需要在函数内修改全局变量p,可以用global关键字声明变量为全局变量:
p="hello" def z(): global p if p == "hello": p="2" print(p) z()
运行后会输出2,因为global p明确告诉Python:这里的p是全局变量,不需要当成局部变量处理。
内容的提问来源于stack exchange,提问作者Arghadeep Modak
相关产品推荐
相关产品推荐

