为什么列表理解与没有理解的代码不一样?

Why list comprehension doesn't work the same as code without comprehension?

我尝试创建一个简单的函数来从列表中删除重复项。

x = [7, 7, 5, 6, 8, 9, 9, 0]
for n, i in enumerate(x):
  if i in x[n + 1:]:
    x.remove(i)
print(x)

输出:

[7, 5, 6, 8, 9, 0]

据我所知,这段代码工作正常。

但是当我试图将它转换为理解列表形式时,我得到了错误的输出:

def unique_list(lst):
  return [lst.remove(i) for n, i in enumerate(lst) if i in lst[n + 1:]]

x = [7, 7, 5, 6, 8, 9, 9, 0]
print(unique_list(x))

输出:

[None, None]

所以,问题是 - 为什么输出不同?

a = [1, 2, 3]
deleted = a.remove(1)
print(deleted)
# returns None
print(a)
# returns [2, 3]

.remove() 更改列表并 returns None

您编写 set(x) 功能的两种方式并不相同。第一个是使用 x.remove(..) 的副作用 "return" 修改后的列表,第二个是 returns 新创建的列表。

该列表的元素由 返回 的表达式 lst.remove(i) 构成,正如 Manuel 在他们的文章中已经指出的那样 None回答。

您收到 [None, None] 因为您的代码调用了 lst.remove 2 次。所以你的函数 unique_list 可以被称为 count_duplicates,只是具有特殊的输出格式(使用 None 列表的长度编码结果而不是直接的 int)。