在查找两个列表的公共部分的列表推导中,pop 有什么用?

What is the use of pop in a list comprehension finding the common part of two lists?

我是 python 的初学者,发现了这个列表理解

l2, common = l2[:], [ e for e in l1 if e in l2 and (l2.pop(l2.index(e)) or True)]

answer to a question about how to find the common elements in two lists(question: Common elements comparison between 2 lists 中)。

l2.pop 部分有什么作用?它只是检查元素是否存在,还是 pop() 的删除部分也很重要?提前谢谢你

正如上面@user202729 所提到的,这段代码代表了一种应该避免的做法,因为它修改了一个可变对象(列表l2)在列表推导中的适当位置并使用了副作用这个修改。像这样编写代码很容易出错,而且可能很难发现这些错误。

无论如何,目标是创建一个列表 common,其中包含 l1l2 共有的元素。此外,如果某个元素在两个列表中都出现了 n 次,那么它将在 common.

中列出 n 次

代码使用了 Python 延迟计算逻辑表达式的事实。 在条件

if e in l2 and ((l2.pop(l2.index(e)) or True)

首先评估第一部分 e in l2。如果给出Falsel1的元素e不在l2中,那么and之后的部分不执行,e是不包含在 common 中,列表理解移动到 l1.

的下一个元素

另一方面,如果 e in l2 的计算结果为 True,则 and 之后的部分将被计算。这部分的值总是True(由于or True位),所以e成为common的一个元素。但是,Python 首先运行 l2.pop(l2.index(e)),它从列表 l2 中删除了一次元素 e。由于这个原因,如果迭代再次遇到列表l1中的相同元素e,那么只有在[=11]中出现该元素才会第二次包含在common中=] 也不止一次。