在Python的函数作用域规则中,函数内部默认只能读取全局变量,如果尝试直接修改全局变量,就会触发UnboundLocalError错误,这是因为Python解释器会将函数内赋值过的变量视为局部变量,而此时局部变量还没有完成赋值就被引用,就会报错。

UnboundLocalError错误产生的原因
Python的作用域分为局部作用域、全局作用域、嵌套作用域和内置作用域,函数内部会优先查找局部作用域的变量。当我们在函数内部对变量进行赋值操作时,解释器会默认将该变量标记为局部变量,此时如果在赋值前引用这个变量,就会出现局部变量未绑定的错误。
下面是一个典型的错误示例:
count = 0 # 全局变量
def add_count():
print(count) # 尝试读取count,此时解释器认为count是局部变量
count = count + 1 # 对count赋值,标记为局部变量
return count
# 调用函数会报错
add_count()
运行上述代码会抛出UnboundLocalError: local variable 'count' referenced before assignment错误,原因就是函数内部对count进行了赋值,解释器将其视为局部变量,而print(count)执行时局部变量还没有被赋值,所以报错。
正确使用global关键字修改全局变量
如果确实需要在函数内部修改全局变量,需要使用global关键字对变量进行声明,告诉解释器该变量是全局变量,而不是局部变量。
修改后的正确代码如下:
count = 0 # 全局变量
def add_count():
global count # 声明count是全局变量
print(count) # 此时可以正常读取全局变量
count = count + 1 # 修改全局变量
return count
# 调用函数
print(add_count()) # 输出1
print(count) # 输出1,全局变量已经被修改
需要注意的是,global声明必须放在变量使用之前,否则依然会报错。如果只是读取全局变量而不修改,不需要使用global关键字。
其他注意事项
避免不必要的全局变量修改
全局变量的修改会影响整个程序的运行状态,过多使用全局变量会让代码的逻辑变得难以追踪,也不利于代码的模块化和测试。如果不是必须的场景,建议尽量通过函数参数传递变量,通过返回值获取结果,减少对全局变量的依赖。
嵌套函数中的全局变量操作
如果在嵌套函数中需要修改外层函数的局部变量,需要使用nonlocal关键字,而修改全局变量依然使用global关键字,二者的作用域范围不同。
count = 0
def outer():
local_count = 10 # 外层函数的局部变量
def inner():
global count # 修改全局变量
nonlocal local_count # 修改外层函数的局部变量
count = count + 1
local_count = local_count + 1
print(count, local_count)
inner()
outer() # 输出1 11
print(count) # 输出1
可变类型全局变量的特殊说明
对于列表、字典这类可变类型的全局变量,即使不修改变量本身的引用,只是修改其内部元素,也不需要加global关键字,因为此时没有对变量本身进行赋值操作。
my_list = [1, 2, 3] # 全局可变变量
def modify_list():
my_list.append(4) # 修改列表内部元素,不需要global声明
print(my_list)
modify_list() # 输出[1, 2, 3, 4]
print(my_list) # 输出[1, 2, 3, 4]
但如果对可变类型变量本身进行重新赋值,比如my_list = [4,5,6],就需要使用global关键字,否则会视为创建局部变量。
Python全局变量UnboundLocalError函数作用域修改时间:2026-07-17 15:09:28