You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 18:02:50