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

标签 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]

无论这是否是好的做法,列表理解的内部不应该做一些可预测的事情吗?如果上面的可预测的,有人可以解释为什么只发生了三个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/

相关文章:

python - 在不破坏阅读器的情况下获取 csv 文件的长度?

java - 将谓词应用于 Java 中的 getter 列表

c# - Linq查询汇总金额列

python - python语言中列表理解的两个列表

python - 匹配文件名开头和文件扩展名的正则表达式

python 目录装饰器

c# - Linq - 将 lambda 隔离为委托(delegate)

python - 替换Python列表中的特殊字符

string - 使用列表理解的 Python 字符串形成

python - 将字符串拆分为两个单独的数字和字母列表 -python