Python 2.7.8遇‘local variable referenced before assignment’报错求排查
解决Python 2.7.8中"local variable referenced before assignment"的常见踩坑点
嘿,我太懂这种盯着报错抓耳挠腮的感觉了!虽然你说已经给变量赋过值,但这个报错在Python 2里有几个非常容易忽略的小细节,咱们一个个排查:
1. 函数内修改全局变量却没声明global
这是最常见的原因!比如你写了这样的代码:
total = 0 def add_score(): total += 5 # 报错就在这里! add_score()
Python 2的规则是:如果函数内部要修改全局变量,必须先声明global 变量名。不然解释器会默认把total当成函数的局部变量,而+=操作是先引用变量当前值再赋值,相当于你还没给局部的total赋值就先用了,自然触发报错。
解决办法很简单,在函数开头加上声明:
total = 0 def add_score(): global total # 声明这是全局变量 total += 5 add_score()
2. 函数内变量的引用顺序在赋值之前
哪怕全局有这个变量,但只要函数内部后续有赋值操作,Python就会把这个变量标记为局部变量。比如:
def calculate(): print(result) # 先引用,后面才赋值 result = 10 * 3 calculate()
这里哪怕全局存在result,函数里的print(result)也会报错——因为解释器看到函数后面有result = ...,就认定result是局部变量,而你在赋值前就调用了它。
解决办法:调整代码顺序,确保变量在引用前完成局部赋值,或者如果要使用全局变量,就加global声明。
3. 嵌套函数里修改外层函数变量的坑
Python 2没有nonlocal关键字,如果你在嵌套函数里想修改外层函数的变量,很容易踩坑:
def outer(): count = 0 def inner(): count += 1 # 报错!解释器把count当成inner的局部变量 inner() outer()
这时候可以用一个小技巧:把变量放进可变对象(比如列表)里,因为修改可变对象的元素不需要声明作用域:
def outer(): count_list = [0] # 用列表存值 def inner(): count_list[0] += 1 # 修改列表元素,没问题 inner() print(count_list[0]) # 输出1 outer()
先对照这几个点检查你的代码,大概率能找到问题!
内容的提问来源于stack exchange,提问作者kfsass
相关产品推荐
相关产品推荐

