Python set.remove behavior 和其他内置函数



在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.removelist.appendset.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 .

相关内容

最新更新