2013-10-31 28 views
1

在Python 2.7.x蟒蛇set.remove行为和其他内建

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

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

回答

6

一般情况下,如果使用python内置函数,如果该方法修改该对象,则返回None以使其绝对明确表示该对象已被修改为到位。在这种情况下,set.remove修改了这个设置,所以按照惯例,它应该返回None

例如,您将看到与list.removelist.appendset.add相同的行为。

对于来自不同语言的人来说,这是一种震撼,通常用于变异对象的方法以及(有效)返回self。这很方便,因为它允许方法被很好地链接在一起......但是,核心python开发人员选择了一条不同的路径,因为他们相信(并且我同意)从长远来看,它会导致更清晰的更明显的代码。我建议你在自己的python代码中使用python的约定(但当然,你可以完全忽略这个建议)。

+0

非常感谢您花时间! (...和我正在采取您的建议,使用python像python是为了使用。:-) – aniketd

4

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

+0

你的是最简洁和最直接的答案!非常感谢!如果这个网站只在我们之间,我会选择你的答案。但是,我会选择@Mcilson的答案,因为对于可能以这种方式出现并且不熟悉“就地”在答案中的意义的读者,可能会错过这一点,因为它没有底气。 – aniketd

+0

@anicake这很好:)。感谢您的回应! – TerryA

2
s = set([-1, -1, -1, 0, -1, 0, 0, 0, 0]) 

remove返回None。您可以确认由remove打印的返回值的类型,像这样

print type(s.remove(-1)) 

你会得到

<type 'NoneType'> 

所以,基本上你设置Nones

+0

非常感谢您的回答。阅读所有我写这篇文章的答案后,我认为我更了解@mgilson的答案,因为他们提到了“就地”修改,而不是返回对象。但是,谢谢。 – aniketd