而不是只写一些代码,并告诉你如何解决这个问题,我会说,使用python调试器对于向你显示你的代码到底是什么有很大的帮助。
首先,您可以手动添加import pdb; pdb.set_trace()
设置代码中的断点如下:
List1 = [['A'],['B']]
List2 = ['A']
import pdb; pdb.set_trace()
for idx, i in enumerate(List1):
if List2 in i:
List1.append(idx[i])
print(List1)
现在,运行代码:
$ python /tmp/t.py
> /tmp/t.py(5)<module>()
-> for idx, i in enumerate(List1):
(Pdb)
您的代码执行到断点并停止。四周看看。在p
或print
命令显示出变量的内容:
(Pdb) p List1
[['A'], ['B']]
(Pdb) p List2
['A']
(Pdb) p List1[0]
['A']
(Pdb)
OK,一切看起来很不错,到目前为止,现在使用的n
或next
命令执行到的下一行代码:
(Pdb) n
> /tmp/t.py(6)<module>()
-> if List2 in i:
(Pdb) p idx
0
(Pdb) p i
['A']
好的,这看起来像我们所期望的。有时我忘了周围的当前行的代码看起来像,这就是当我使用l
或list
命令:再次
(Pdb) list
1 List1 = [['A'],['B']]
2 List2 = ['A']
3
4 import pdb; pdb.set_trace()
5 for idx, i in enumerate(List1):
6 -> if List2 in i:
7 List1.append(idx[i])
8
9 print(List1)
[EOF]
使用n
去的下一行代码:
> /tmp/t.py(5)<module>()
-> for idx, i in enumerate(List1):
(Pdb)
它开始于for循环的下一次迭代!你是否期待接下来执行第7行?为什么不呢?
使用q
或quit
退出调试,然后让我们重新开始,并返回到第6行,然后在调试器中计算表达式:
(Pdb) q
...
bdb.BdbQuit
$ python /tmp/t.py
> /tmp/t.py(5)<module>()
-> for idx, i in enumerate(List1):
(Pdb) n
> /tmp/t.py(6)<module>()
-> if List2 in i:
(Pdb) p List2
['A']
(Pdb) p i
['A']
(Pdb) p List2 in i
False
这是否令你感到惊讶?你遇到的问题是它正在寻找列表中包含“A”的数组。
(Pdb) p ['A'] in i
False
对于是真实的i
必须是这样的:
(Pdb) p ['A'] in [['A']]
True
你真正想要问是:
(Pdb) p 'A' in i
True
我希望帮助您调试代码!
- 请注意,我不得不修复几个拼写错误来运行您的示例。检查您的代码,确保它在下次发布您的问题之前运行。
你的第二个'B'从什么时候开始?你的问题似乎意味着会有一个额外的'A',而不是? – Ben 2015-04-05 13:06:46
看看你的变量的类型。 'list2'是一个列表,'i'是一个列表。所以病情从未实现。无论如何,你会在下一行中得到一个TypeError。 – Daniel 2015-04-05 13:17:26
“然后检查List1是否包含List2的值”。你的意思是“List2的值”,或“List2中的值”。因为你在句子的下半部分使用后者,但说第一个(“value”)意味着你想比较完整的列表。 – Evert 2015-04-05 13:21:57