【发布时间】:2011-12-15 04:50:29
【问题描述】:
我有这个代码:
s = [2,3,4,5]
for i in s:
s.remove(i)
print(s)
当我运行它时,结果是:
[3,5]
这里的逻辑错误是什么?
【问题讨论】:
标签: python python-3.x
我有这个代码:
s = [2,3,4,5]
for i in s:
s.remove(i)
print(s)
当我运行它时,结果是:
[3,5]
这里的逻辑错误是什么?
【问题讨论】:
标签: python python-3.x
您在修改列表时正在迭代列表,这导致了您的问题。
制作一个临时列表 (list(s)),您可以对其进行迭代并根据需要修改原始列表:
>>> s = [2,3,4,5]
>>>
>>> for i in list(s):
... s.remove(i)
...
>>> print(s)
[]
【讨论】:
逻辑错误是在迭代同一列表时从列表中删除元素。
当然,Python 隐藏了一些实现细节。在内部,您删除第一项,留下[3,4,5]。然后删除第二项,留下[3,5]。至此,您已经从一个只有两个项目长的列表中删除了两个项目,因此您完成了。
【讨论】:
这是因为迭代器。考虑这个代码段:
s = [2,3,4,5]
for i in s:
print "i",i
j = s
print "j", j
s.remove(i)
print "removed"
print "j", j
print "s", s
print s
输出将是
i 2
j [2, 3, 4, 5]
removed
j [3, 4, 5]
s [3, 4, 5]
i 4
j [3, 4, 5]
removed
j [3, 5]
s [3, 5]
[3, 5]
基本上,当你执行for循环时,内部迭代器会先到s[0],然后是s[1],等等。当下一轮循环执行时,s[1]已经是4而不是3因为 s 本身已经被修改了。
【讨论】: