为何第二个Python示例中全局变量x失效,出现“局部变量x赋值前引用”错误?
为什么两个Python示例运行结果不同?
示例1代码(正常输出1)
def num(): global x x = 1 def test(): print(x) num() test()
示例2代码(报错:Local Variable 'x' referenced before assignment)
def num(): global x x = 1 def test(): while x < 10: print(x) x+=1 num() test()
原因解释
Python的变量作用域遵循以下核心规则:
- 当函数内部仅读取变量时,会优先查找局部作用域的变量,找不到则向上查找全局作用域的变量。
- 当函数内部对变量进行赋值操作(包括
x+=1这种复合赋值,本质是x = x + 1,属于赋值行为),Python会默认这个变量是局部变量,除非你用global关键字显式声明它是全局变量。
对两个示例的具体分析
- 示例1:
test函数里只有print(x),属于单纯的读取操作。num()已经通过global声明把全局变量x赋值为1,所以test会直接读取全局的x,正常输出1。 - 示例2:
test函数里有x+=1的赋值操作,Python会自动把x判定为test的局部变量。但在while x <10这一行,程序先引用了这个还未定义的局部x,就触发了“局部变量在赋值前被引用”的错误。如果要修复,只需在test函数开头加上global x声明,告诉Python这个x是全局变量。
内容的提问来源于stack exchange,提问作者iminertia
相关产品推荐
相关产品推荐

