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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:23:22