我一直在使用pop
函数尝试列表整理中的takewhile
元素,而且我遇到的事情对我来说很难理解。我的终端会议看起来像这样:
然而,当我用字符串尝试相同的事情时,问题没有发生:
有人可以向我解释在第一个场景中发生的情况吗?为什么g.pop(0)
仅返回[1, 2]
?
复制的脚本(为什么Stack没有可折叠的部分):
>>> from itertools import takewhile
from itertools import takewhile
>>> g = [1,2,3,4,5]
>>> [a for a in takewhile(lambda x: x < 4, g)]
[1, 2, 3]
>>> [g.pop() for _ in takewhile(lambda x: x < 4, g)]
[5, 4, 3]
>>> g = [1,2,3,4,5]
>>> [g.pop(0) for _ in takewhile(lambda x: x < 4, g)]
[1, 2]
>>> g = ['1', '2', '3', '4', '5']
>>> [a for a in takewhile(lambda x: x != '4', g)]
['1', '2', '3']
>>> [g.pop() for _ in takewhile(lambda x: x != '4', g)]
['5', '4', '3']
>>> g = ['1', '2', '3', '4', '5']
>>> [g.pop(0) for _ in takewhile(lambda x: x != '4', g)]
['1', '2', '3']
答案 0 :(得分:1)
我弄清楚了,因为我试图使用deque
来提升RuntimeError: deque mutated during iteration
。
执行是这样的:
g[0] = 1 < 4; g.pop(0) => 1
g[1] = 3 < 4; g.pop(0) => 2
g[2] = 5 > 4; break
这也解释了为什么它在第二种情况下起作用,因为在迭代期间'4'
没有被击中。