Python UnboundLocalError疑问:全局列表为何提示未赋值?
全局可变列表触发UnboundLocalError的原因及解决
先还原你的代码场景:
knownBad = [] def main(): # 追加输入的字符 knownBad.append(input("输入一个字符:")) # 去重赋值操作 knownBad = list(dict.fromkeys(knownBad)) main()
运行后会触发报错:UnboundLocalError: local variable 'knownBad' referenced before assignment
核心原因
Python的作用域规则是:只要函数内部存在对变量的赋值语句,Python就会默认这个变量是局部变量,不管全局作用域里有没有同名变量。
你在main函数里先执行knownBad.append(...),但因为后面存在knownBad = ...的赋值操作,Python会提前把整个函数里的knownBad标记为局部变量。而append执行时,这个局部变量还未被定义(赋值语句在后面),所以就触发了“局部变量未定义就引用”的错误。
这里要明确两个操作的区别:
knownBad.append(...):这是修改全局列表的内容,没有改变knownBad变量本身的绑定(它依然指向全局的那个空列表)。knownBad = list(dict.fromkeys(knownBad)):这是给knownBad变量重新赋值,相当于创建了一个新的列表对象,让局部的knownBad指向它——Python看到这个赋值语句,就会把函数内所有的knownBad都当成局部变量处理。
两种解决办法
用
global声明变量为全局
明确告诉Python,函数里的knownBad是全局作用域的变量,这样赋值操作就会直接修改全局变量:knownBad = [] def main(): global knownBad knownBad.append(input("输入一个字符:")) knownBad = list(dict.fromkeys(knownBad)) main()避免直接赋值,修改原列表
利用列表的可变性,清空原列表后把去重后的元素加回去,这样不用改变变量的绑定:knownBad = [] def main(): knownBad.append(input("输入一个字符:")) unique_items = list(dict.fromkeys(knownBad)) knownBad.clear() knownBad.extend(unique_items) main()
内容的提问来源于stack exchange,提问作者mvery
相关产品推荐
相关产品推荐

