None
,而不是返回列表本身。例如:>>> mylist = ['a', 'b', 'c']
>>> empty = mylist.clear()
>>> restored = mylist.extend(range(3))
>>> backwards = mylist.reverse()
>>> with_four = mylist.append(4)
>>> in_order = mylist.sort()
>>> without_one = mylist.remove(1)
>>> mylist
[0, 2, 4]
>>> [empty, restored, backwards, with_four, in_order, without_one]
[None, None, None, None, None, None]
这个决定背后的思考过程是什么?
对我来说,这似乎是在阻碍,因为它阻止了列表处理的“链接”(例如
mylist.reverse().append('a string')[:someLimit]
)。我想可能是因为“权力机构”认为列表推导是一个更好的范式(一个有效的观点),所以不想鼓励其他方法 - 但是阻止一种直观的方法似乎有些荒谬,即使存在更好的替代方案。
这个问题特指Python在设计上决定对于像.append
这样的列表修改方法返回None
。然而,初学者常常编写错误的代码,期望.append
(特别是)返回刚刚修改的同一个列表。但请将这类问题标记为重复问题,并关闭它们。在这些情况下,"代码执行结果为None
而不是列表"是一个应该通过调试独立发现的问题。创建一个合适的MRE会留下类似这个问题的疑问,因此可以认为它是一个重复问题。
请参阅如何收集重复计算的结果到一个列表、字典等(或者复制一个每个元素都被修改的列表)?来解答关于"如何重复向列表追加元素"的简单问题(或者归结为该问题的调试问题)。这是一个专门为初学者准备的新规范问题。
要获取列表的修改版本,请参考:
- 如何使得列表的 append() 方法返回新的列表
- 如何获取列表的排序副本
- 如何在 Python 中连接两个列表(替代 .extend)
- 如何快速返回不包含特定元素的列表(替代 .remove)
- 如何获取列表的反向副本(避免在 .reverse 之后使用单独语句链式调用方法)
set.discard
(参见如何使用列表推导从列表中的集合中删除特定元素)和dict.update
(参见为什么python的dict.update()不返回对象?)。同样的道理也适用于设计自己的API。请参阅使原地操作返回对象是一个坏主意吗?。