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

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都当成局部变量处理。

两种解决办法

  1. 用global声明变量为全局
    明确告诉Python,函数里的knownBad是全局作用域的变量,这样赋值操作就会直接修改全局变量:

    knownBad = []
    
    def main():
        global knownBad
        knownBad.append(input("输入一个字符:"))
        knownBad = list(dict.fromkeys(knownBad))
    
    main()
    
  2. 避免直接赋值,修改原列表
    利用列表的可变性,清空原列表后把去重后的元素加回去,这样不用改变变量的绑定:

    knownBad = []
    
    def main():
        knownBad.append(input("输入一个字符:"))
        unique_items = list(dict.fromkeys(knownBad))
        knownBad.clear()
        knownBad.extend(unique_items)
    
    main()
    

内容的提问来源于stack exchange,提问作者mvery

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:33:10