在 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 的约定(当然,您可以完全无视该建议)。
关于python set.remove 行为和其他内置函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19700390/