为什么奇怪的列表理解行为有副作用?

ely*_*ely 1 python lambda list-comprehension side-effects

我知道在Python列表推导中使用副作用并不是一种好的做法.但我无法理解为什么会发生以下情况:

In [66]: tmp = [1,2,3,4,5]; [tmp.remove(elem) for elem in tmp]
Out[66]: [None, None, None]

In [67]: tmp
Out[67]: [2, 4]
Run Code Online (Sandbox Code Playgroud)

无论这是否是一种好的做法,列表理解的内部是否应该做一些可预测的事情?如果以上可预测的,有人可以解释为什么只remove发生了三次操作,为什么偶数条目仍然存在?

DSM*_*DSM 6

这不是关于listcomps,而是关于从迭代的列表中删除:

>>> tmp = [1,2,3,4,5]
>>> for elem in tmp:
...     tmp.remove(elem)
... 
>>> tmp
[2, 4]
Run Code Online (Sandbox Code Playgroud)

它是这样的:

>>> tmp = [1,2,3,4,5]
>>> for elem in tmp:
...     print elem, tmp
...     tmp.remove(elem)
...     print elem, tmp
... 
1 [1, 2, 3, 4, 5]
1 [2, 3, 4, 5]
3 [2, 3, 4, 5]
3 [2, 4, 5]
5 [2, 4, 5]
5 [2, 4]
Run Code Online (Sandbox Code Playgroud)

首先,它正在查看第0个元素,并删除1.所以在下一次迭代中,它想要删除第一个元素,现在是3,等等.