python set.remove行为和其他内置函数

时间:2013-10-31 07:14:17

标签: python set

在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])

为什么函数链在上面的例子中不能按预期工作?

3 个答案:

答案 0 :(得分:6)

通常,使用python内置函数,如果方法修改了对象,它将返回None以使其完全明确地表示对象已被修改到位。在这种情况下,set.remove修改了适当的集合,因此按照惯例,它应该返回None

例如,您会看到与list.removelist.appendset.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