set.remove
是就地操作。这意味着它不返回任何东西(嗯,它返回None
);并且bool(None)
是False
。
所以你的列表理解实际上是这样的:
answer = []
for item in seq:
if item in uniq and not uniq.remove(item):
answer.append(item)
并且由于python确实短路了条件(正如其他人指出的那样),这实际上是:
answer = []
for item in seq:
if item in uniq:
if not uniq.remove(item):
answer.append(item)
当然,由于unique.remove(item)
返回None
(bool
其中是False
),要么评估两个条件,要么都不评估。
存在第二个条件的原因是从 中item
删除uniq
。这样,如果/当您item
再次遇到(作为 中的重复项seq
)时,将不会在其中找到它,因为它已从上次在那里找到时uniq
被删除。uniq
现在,请记住,这是相当危险的,因为修改变量的条件被认为是不好的风格(想象一下当你不完全熟悉它的作用时调试这样的条件)。条件真的不应该修改他们检查的变量。因此,他们应该只读取变量,而不是写入它们。
希望这可以帮助