【发布时间】:2012-10-16 23:16:43
【问题描述】:
我知道在 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 操作,为什么偶数条目是剩下的?
【问题讨论】:
-
@JoshLee 我不需要删除元素本身,我只是想了解为什么
None or...的东西不起作用。事实证明它正在工作,我没有意识到索引正在改变。 -
另外,在这个例子中,我放置
None的部分实际上是一个昂贵的计算,可能导致返回None,在这种情况下从tmp中删除项目发生这种情况的地方可能对我来说是一个可行的选择。但无论哪种方式,在列表解析的末尾也包含一个if子句并不好,因为它需要再次评估那个昂贵的函数才能知道要保留什么。 -
好吧,你总是可以把
None or x改写成x。 -
None可能由我的实际代码中的昂贵函数返回。
标签: python lambda list-comprehension side-effects