在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])
为什么函数链在上面的例子中不能按预期工作?
答案 0 :(得分:6)
通常,使用python内置函数,如果方法修改了对象,它将返回None
以使其完全明确地表示对象已被修改到位。在这种情况下,set.remove
修改了适当的集合,因此按照惯例,它应该返回None
。
例如,您会看到与list.remove
或list.append
或set.add
相同的行为。
这给来自不同语言的人们带来了震撼,其中一种方法来改变对象并且(有效地)返回self
。方便的是它允许方法很好地链接...但是,核心python开发者选择了一条不同的路径,因为他们相信(并且我同意)从长远来看,它会导致更清晰,更明显的代码。我建议你在你自己的python代码中使用python的约定(当然,你可以完全忽略这个建议)。
答案 1 :(得分:4)
set.remove()
不会返回包含已删除项目的集合,而是会将其删除。当它这样做时,该函数将返回None
。从技术上讲,你在第一个例子中正在做s = None
。
答案 2 :(得分:2)
s = set([-1, -1, -1, 0, -1, 0, 0, 0, 0])
remove
返回None
。您可以通过从remove
这样打印返回值的类型来确认
print type(s.remove(-1))
你会得到
<type 'NoneType'>
因此,基本上您将None
设置为s
。