Python使用列表推导式对列表去重时赋值后得到全None的原因是什么
列表推导式返回全None值的原因
你遇到的现象本质是由Python列表append()方法的返回值特性决定的:
- Python中所有原地修改容器的方法(比如列表的
append()、extend()、sort(),字典的update()等)都没有返回值,默认返回None。这些方法的作用是直接修改调用它的对象本身,不会额外返回处理后的结果。
两种写法的执行逻辑
第一种写法
[unique_lists.append(x) for x in lists if x not in unique_lists]
这里你没有保存列表推导式生成的结果,只是利用了列表推导式遍历过程的副作用来执行append()操作修改unique_lists。此时这个推导式实际生成的就是全None的列表,只是没有赋值给变量被直接丢弃了,你打印的是被修改后的unique_lists,所以得到了正确的去重结果。
第二种写法
g = [unique_lists.append(x) for x in lists if x not in unique_lists]
这里你把列表推导式生成的结果赋值给了g,而推导式每个循环对应的元素就是append(x)的返回值None,所以打印g就会得到全None的列表。但此时unique_lists依然已经被正确修改为去重后的列表,你可以尝试打印unique_lists验证这一点。
补充注意事项
不推荐用列表推导式来执行带副作用的操作,列表推导式的设计初衷是快速生成新列表,这种用法会平白无故生成一个无用的全None列表占用内存。如果只是要循环执行修改操作,直接用普通for循环更符合规范:
unique_lists = [] for x in lists: if x not in unique_lists: unique_lists.append(x)
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

