我知道在 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]
无论这是否是好的做法,列表理解的内部不应该做一些可预测的事情吗?如果上面的是可预测的,有人可以解释为什么只发生了三个remove
操作,为什么剩下的是偶数项?
最佳答案
这不是关于 listcomps,而是关于从您正在迭代的列表中删除:
>>> tmp = [1,2,3,4,5]
>>> for elem in tmp:
... tmp.remove(elem)
...
>>> tmp
[2, 4]
它是这样的:
>>> 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]
首先它查看第 0 个元素,然后删除 1。所以在下一次迭代中,它想要删除第一个元素,现在是第 3 个,等等。
关于python - 为什么奇怪的列表理解行为有副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12924884/