在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的约定(当然,你可以完全忽略这个建议)。
set.remove()
不会返回包含已删除项的集合,而是将它们就地删除。执行此操作时,该函数将返回None
。所以从技术上讲,你在第一个例子中s = None
做。
s = set([-1, -1, -1, 0, -1, 0, 0, 0, 0])
remove
返回None
.您可以通过打印返回值的类型来确认remove
print type(s.remove(-1))
你会得到
<type 'NoneType'>
所以,基本上你把None
设置为 s
.