【发布时间】:2016-05-24 09:38:17
【问题描述】:
我经常发现自己在处理类似于以下代码触发的故障的问题。如您所见,我在此示例中使用的对策是徒劳的:由于某种原因,while len(some_list) > n + 1 最终会给出“误报”。
当然,我可以使用pass 语句来覆盖这个“有趣的行为”(即使我认为它有点“hacky”,它会起作用)。然而,重点是:为什么会发生这种情况?
some_list = [2,3,2]
some_list.sort(reverse=True)
n = 0
while len(some_list) > 1 and n < len(some_list) - 1:
try:
while len(some_list) > n + 1:
# This `if` statement was my last counter-measure
if n + 1 >= len(some_list):
break
while some_list[n] == some_list[n+1]:
some_list[n] += some_list.pop(n+1)
else:
n += 1
except:
print "WTF!!! len =",len(some_list),", n =",n
raise
这是命令行的响应:
WTF!!! len = 2 , n = 1
Traceback (most recent call last):
File "example.py", line 11, in <module>
while some_list[n] == some_list[n+1]:
IndexError: list index out of range
说明:
- 我故意使用
.pop()来消除该元素。 - 问题的目的是确定此类错误的原因,仅此而已。
- 代码只是触发我想在问题中公开的异常的示例。
- 代码的“目的”是消除列表重复项,将它们添加到相邻元素(预期相等)。
错误的猜测导致问题的表述错误
使用@Kevin M granger 推荐的调试器后:
-> while len(some_list) > n + 1:
(Pdb) print len(some_list), ">", n + 1
3 > 2
(Pdb) next
> /tmp/kpasa.py(10)<module>()
-> if n + 1 >= len(some_list):
(Pdb) print n + 1, ">=", len(some_list)
2 >= 3
(Pdb) next
> /tmp/kpasa.py(13)<module>()
-> while some_list[n] == some_list[n+1]:
(Pdb) print len(some_list), n
3 1
(Pdb) next
> /tmp/kpasa.py(14)<module>()
-> some_list[n] += some_list.pop(n+1)
(Pdb) next
> /tmp/kpasa.py(13)<module>()
-> while some_list[n] == some_list[n+1]:
(Pdb) print len(some_list), n
2 1
(Pdb) next
IndexError: 'list index out of range'
我意识到自己的愚蠢。根本没有“误报”。 这个问题其实很蠢,所以我同意必须删除它。
我很抱歉我的粗鲁和愚蠢。
【问题讨论】:
-
这段代码的目的是什么?您的预期结果是什么?
-
使用a debugger 逐行执行代码,同时监控变量及其值。
-
另外,想想当
n等于列表中倒数第二个索引(在您的示例中为1)时会发生什么,并且您从列表中弹出最后一个元素。那么n + 1将引用什么元素? -
代码本身并不重要。我正在尝试了解有关此问题的更多信息,仅此而已。但是,为了完整起见,此示例中的“目的”是消除列表重复项,将它们添加到相邻元素(预期相等)。我只是尽可能地隔离了这个问题。
-
Python 带有一个内置的调试器。
python -m pdb ./scriptname.py
标签: python loops while-loop