将数字添加到集合

45 投票
8 回答
95354 浏览
提问于 2025-04-17 13:06

我在这里做错了什么呢?

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的做法也可以接受。

撰写回答