Skip to main content
 首页 » 编程设计

python set.remove 行为和其他内置函数

2025年05月04日12leader

在 Python 2.7.x 中

In [21]: s = set([-1, -1, -1, 0, -1, 0, 0, 0, 0]).remove(-1) 
 
In [22]: type(s) 
Out[22]: NoneType 

和

In [23]: s = set([-1, -1, -1, 0, -1, 0, 0, 0, 0]) 
 
In [24]: type(s) 
Out[24]: set 
 
In [25]: s.remove(-1) 
 
In [26]: type(s) 
Out[26]: set 
 
In [27]: s 
Out[27]: set([0]) 

为什么函数链在上面的例子中没有按预期工作?

请您参考如下方法:

通常,对于 python 内置函数,如果该方法修改了对象,它会返回 None 以绝对明确地表明该对象已被就地修改。在这种情况下,set.remove 就地修改了集合,因此按照惯例,它应该返回 None。

例如,您将看到与 list.remove 或 list.append 或 set.add 相同的行为。

这让来自不同语言的人感到震惊,在这些语言中,一种方法改变对象并(有效地)返回 self 是很常见的。它很方便,因为它允许很好地链接方法......但是,核心 python 开发人员选择了不同的路径,因为他们相信(并且我同意)从长远来看,它会导致更清晰更明显的代码。我建议您在自己的 Python 代码中使用 Python 的约定(当然,您可以完全无视该建议)。