Python 错误:“赋值前引用局部变量<class 'list'>”

问题描述 投票:0回答:1

我在顶层创建了一个空列表。然后,在函数内部,我用单字符字符串填充该列表,并从列表中删除重复项。

knownBad = []

def main():
    badTemp = input("Enter all letters not in the word: ")
    for i in badTemp:
        knownBad.append(i)
    knownBad = list(dict.fromkeys(knownBad))#removes duplicates
    print(knownBad)

main()

当我这样做时,我得到回溯错误:

Traceback (most recent call last):
  File "c:\Users\mvery\OneDrive - Diocese of Greensburg Schools\Desktop\Python\demo.py", line 10, in <module>
    main()
  File "c:\Users\mvery\OneDrive - Diocese of Greensburg Schools\Desktop\Python\demo.py", line 6, in main     
    knownBad.append(i)
UnboundLocalError: local variable 'knownBad' referenced before assignment

这看起来很奇怪,考虑到'knownBad'变量实际上是一个列表,它是可变结构。列表“knownBad”并没有真正在函数中“分配”,因为它是在顶层创建的。

我错过了什么愚蠢的东西吗?第 7 行只是从列表中删除重复项的一种非常错误的方法吗?它可能与从列表中创建字典,然后使用该字典的 fromkeys() 方法更改列表有关吗?

我发现检查列表项是否重复的那一行(第 7 行)似乎是导致问题的原因。当它被注释掉时,错误不会出现,程序会按预期解析(当然没有删除重复项)。我看到第 7 行是对“knownBad”列表的一种赋值类型,但该列表仍然存在。这不像是在第 7 行创建的列表。

我在这里找到了两个解决问题的方法,但是我不明白为什么这个问题首先会发生。这似乎与列表的可变性背道而驰。

感谢您的帮助!

python list dictionary local
1个回答
0
投票

如果一个变量在函数中的anywhere赋值(即使在函数的一部分尚未执行!),那么该变量在函数中被视为局部everywhere

你的函数确实分配给变量,用这行代码:

knownBad = list(dict.fromkeys(knownBad))#removes duplicates

因此

knownBad
被视为局部变量,因此前一行导致错误:

knownBad.append(i)

... 因为它期望

knownBad
是一个 local 变量,但它还没有(还)被赋值。

如果你想使用全局变量,那么你必须在函数的顶部这样说:

global knownBad
© www.soinside.com 2019 - 2024. All rights reserved.