清单中的不完整列表弹出

时间:2016-10-18 12:16:28

标签: python python-2.7 list-comprehension pop

我一直在使用pop函数尝试列表整理中的takewhile元素,而且我遇到的事情对我来说很难理解。我的终端会议看起来像这样:

enter image description here

然而,当我用字符串尝试相同的事情时,问题没有发生:

enter image description here

有人可以向我解释在第一个场景中发生的情况吗?为什么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']

1 个答案:

答案 0 :(得分:1)

我弄清楚了,因为我试图使用deque来提升RuntimeError: deque mutated during iteration

执行是这样的:

  1. g[0] = 1 < 4; g.pop(0) => 1
  2. g[1] = 3 < 4; g.pop(0) => 2
  3. g[2] = 5 > 4; break
  4. 这也解释了为什么它在第二种情况下起作用,因为在迭代期间'4'没有被击中。