好的,所以我有一块我正在尝试调试的代码,我通常使用Pythontutor.com来逐步查看它出错的地方。问题是,确切的代码可以在网站上使用,但不能在我的控制台中使用。
row = []
row.append("Acid Arrow")
testList = ['Detect', 'Discern', 'Summon', 'Call', 'Binding']
nameList = row[0].split(' ')
print testList, nameList
a = list(set(testList) & set(nameList))
我得到的错误是:
C:\Users\User\Dropbox\D&D\SpellBag>livingSpell.py
['Detect', 'Discern', 'Summon', 'Call', 'Binding'] ['Acid', 'Arrow']
Traceback (most recent call last):
File "C:\Users\User\Dropbox\D&D\SpellBag\livingSpell.py", line 121, in <module>
sb = spellBook(r'allSpells.csv')
File "C:\Users\User\Dropbox\D&D\SpellBag\livingSpell.py", line 27, in __init__
a = list(set(testList) & set(nameList))
TypeError: 'str' object is not callable
上面的代码在PythonTutor上完美运行,但是当我在控制台中运行它时失败了。它打算做的是检查列表中的单词是否在拼写名称中,如果其中任何一个单词是,则该拼写将被传递并继续前进。它应该返回一个空列表,但我得到错误。
答案 0 :(得分:2)
出错的行是a = list(set(testList) & set(nameList))
,错误说“'str'对象不可调用。”这意味着Python解释器试图调用一个函数,发现它实际上并不是一个函数。如果您键入"bad_code"()
,则会出现相同的错误,因为字符串"bad_code"
不是函数。
不可能准确地说出两者中哪一个有问题,但list
或set
已被覆盖,现在是一个字符串而不是Python中提供的默认函数。这段代码在pythontutor.com中可以正常工作,因为有问题的代码行发生在你的文件之前的某个地方(错误说你预先有22行代码)。事实上,如果您启动了一个空白文件并且只在StackOverflow上发布了此片段,那么它将完美运行。检查原始源代码中的list = ...
或set = ...
等内容。
在Python中,通过在名称后附加下划线来避免命名与保留字(list,set,或if,with,while等等)的冲突是一种常见的约定。在这种情况下,这意味着要写list_ = ...
或set_ = ...
。一般来说,一个好的编码实践是为你的变量提出一个特定的名称来描述它。例如,您可以使用used_spell_list
代替list
(只是猜测......我不知道这是如何被覆盖的。)