Python全局/局部变量差异:同名变量引发UnboundLocalError问题咨询
问题分析与解决
先看你的代码:
test=4 def sum1(var): print("in function, test",test) var+=1 test=7 print("in function, var",var) print("in function, test",test) sum1(5) print(test)
出现UnboundLocalError的核心原因是Python的静态作用域解析规则:当函数内部存在对某个变量的赋值操作时,Python会在编译函数阶段就将该变量标记为整个函数范围内的局部变量,而非动态引用全局变量。哪怕赋值语句出现在变量引用之后,第一个print(test)尝试访问的是未初始化的局部test,自然触发错误。
两种解决思路
- 修改全局变量:如果需要在函数内修改全局的
test,必须用global关键字声明该变量为全局变量:
test=4 def sum1(var): global test # 声明test为全局变量 print("in function, test",test) var+=1 test=7 print("in function, var",var) print("in function, test",test) sum1(5) print(test) # 输出7,全局变量已被修改
- 仅读取全局变量:如果只是想读取全局
test而不修改,直接删除函数内的test=7赋值语句即可,此时Python会自动引用全局变量:
test=4 def sum1(var): print("in function, test",test) var+=1 print("in function, var",var) sum1(5) print(test) # 输出4,全局变量未被改动
关键知识点
- Python的作用域判断是编译时静态确定,而非运行时动态查找。
- 函数内只要存在变量赋值,该变量就默认是局部变量,除非显式用
global(或嵌套作用域用nonlocal)声明。
内容的提问来源于stack exchange,提问作者ANEN
相关产品推荐
相关产品推荐

