在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
Run Code Online (Sandbox Code Playgroud)
和
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])
Run Code Online (Sandbox Code Playgroud)
为什么函数链在上面的例子中不能按预期工作?
通常,使用python内置函数,如果方法修改了对象,它将返回None以使其绝对明确表示对象已在适当位置进行了修改.在这种情况下,set.remove修改集合到位,因此按照惯例,它应该返回None.
你会看到相同的行为list.remove或list.append或set.add例如.
这对于来自不同语言的人来说是一种冲击,在这种情况下,一种方法可以改变对象并且(有效地)返回self.方便的是它允许方法很好地链接...但是,核心python开发者选择了一条不同的路径,因为他们相信(并且我同意)从长远来看,它会导致更清晰,更明显的代码.我建议你在你自己的python代码中使用python的约定(当然,你可以完全忽略这个建议).