在 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 的约定(当然,您可以完全无视该建议)。
