将数字添加到集合
我在这里做错了什么呢?
a = set().add(1)
print a # Prints `None`
我想把数字 1
加到一个空集合里。
8 个回答
5
因为 add()
这个函数是在原地修改你的集合,并且返回的是 None
:
>>> empty = set()
>>> print(empty.add(1))
None
>>> empty
set([1])
28
add()
这个方法是用来往集合里添加一个元素的,但它不会把集合再返回给你,而是返回一个None
。
a = set()
a.add(1)
或者更好的是
a = set([1])
这样也可以。
64
在Python中,有个约定是那些会改变序列内容的方法会返回None
。
举个例子:
>>> a_list = [3, 2, 1]
>>> print a_list.sort()
None
>>> a_list
[1, 2, 3]
>>> a_dict = {}
>>> print a_dict.__setitem__('a', 1)
None
>>> a_dict
{'a': 1}
>>> a_set = set()
>>> print a_set.add(1)
None
>>> a_set
set([1])
有些人可能会觉得这个约定“在Python中设计得很糟糕”,但是设计和历史的常见问题解答中解释了这个设计决定的原因(关于列表的):
为什么
list.sort(
不返回排序后的列表?在性能很重要的情况下,仅仅为了排序而复制一个列表是很浪费的。因此,
list.sort()
是在原地对列表进行排序。为了提醒你这一点,它不返回排序后的列表。这样,你就不会在需要一个排序副本但又想保留未排序版本的时候,意外地覆盖了原来的列表。在Python 2.4中,新增了一个内置函数——
sorted()
。这个函数会从一个可迭代对象创建一个新的列表,进行排序后返回这个新列表。
你对这个特性的困惑,实际上是对如何正确创建集合的误解,而不是语言设计上的问题。正如Lattyware所指出的,在Python 2.7及以后的版本中,你可以使用集合字面量a = {1}
,或者像Sven Marnach的回答那样使用a = set([1])
。
顺便说一下,我喜欢Ruby中在改变对象的方法后加个感叹号的约定,但我觉得Python的做法也可以接受。