1

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

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

4

3 回答 3

6

通常,使用 python 内置函数,如果该方法修改了对象,它会返回None以绝对明确地表明该对象已就地修改。在这种情况下,set.remove修改集合,所以按照惯例,它应该返回None

例如,您将看到与list.removeorlist.append或或相同的行为set.add

这让来自不同语言的人感到震惊,在这些语言中,一种方法很常见,可以改变对象并(有效地)返回self。这很方便,因为它允许很好地链接方法......但是,核心 python 开发人员选择了不同的路径,因为他们相信(我同意)从长远来看,它会导致更清晰更明显的代码。我建议您在自己的 python 代码中使用 python 的约定(当然,您可以完全无视该建议)。

于 2013-10-31T07:15:14.303 回答
4

set.remove()不会返回包含已删除项目的集合,而是将它们删除到位。执行此操作时,该函数将返回None. 所以从技术上讲,你s = None在第一个例子中正在做。

于 2013-10-31T07:15:13.033 回答
2
s = set([-1, -1, -1, 0, -1, 0, 0, 0, 0])

remove返回Noneremove您可以通过像这样打印返回值的类型来确认

print type(s.remove(-1))

你会得到

<type 'NoneType'>

所以,基本上你设置Nones.

于 2013-10-31T07:40:56.573 回答