Python函数内变量作用域疑问:为何局部变量未赋值即引用报错
Python局部与全局作用域的常见误区
先看你给出的代码:
a=1 def func(): print(a) # Error: local variable 'a' referenced before assignment a=2 print(a) func()
你遇到的问题核心在于Python的作用域是编译阶段确定的,不是运行时动态查找的:
- 当Python解析
func函数的定义时,会扫描整个函数体,只要发现里面有a=2这种赋值语句,就会直接把函数内所有的a标记为局部变量,不会再去全局作用域查找a。 - 所以当函数运行到第一个
print(a)时,Python明确知道a是局部变量,但此时a还未被赋值(a=2在后面),自然抛出"local variable 'a' referenced before assignment"的错误。
再拆解你测试的两种情况:
- 注释第一个
print(a):函数里只有a=2和第二个print(a),局部变量a先被赋值再使用,符合规则,正常输出2。 - 注释
a=2:函数体内没有对a的赋值操作,Python会把a当作全局变量处理,直接读取全局作用域的a=1,输出1。
至于你用locals()排查时看到第一个print执行时局部作用域没有a,这是因为局部变量要到赋值语句执行时才会被加入局部作用域,但Python在编译阶段已经把a归为局部变量,所以不会去全局作用域查找,直接判定为“引用未赋值的局部变量”。
内容的提问来源于stack exchange,提问作者Mike Smith
相关产品推荐
相关产品推荐

