添加要设置的号码

Ran*_*lue 43 python set

我在这做错了什么?

a = set().add(1)
print a # Prints `None`
Run Code Online (Sandbox Code Playgroud)

我正在尝试将数字添加1到空集.

Ste*_*ski 62

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])
Run Code Online (Sandbox Code Playgroud)

有些人可能认为这个惯例"在Python中是一个可怕的错误设计",但设计和历史常见问题解答给出了这个设计决策背后的原因(关于列表):

为什么不list.sort(返回排序列表?

在性能很重要的情况下,制作列表的副本只是为了对它进行排序将是浪费.因此,list.sort()将列表排序到位.为了提醒您这一事实,它不会返回排序列表.这样,当您需要排序副本时,您不会被意外地覆盖列表,但也需要保留未排序的版本.

在Python 2.4中添加了一个新的内置函数 - sorted().此函数从提供的iterable创建一个新列表,对其进行排序并返回它.

您对此功能的特殊问题来自于对创建集合而不是语言错误设计的好方法的误解.正如Lattyware所指出的,在Python 2.7及更高版本中,您可以使用set literal a = {1}或a = set([1])按照Sven Marnach的答案进行操作.

顺便说一下,我喜欢Ruby在变异对象的方法之后放置感叹号的惯例,但我发现Python的方法是可以接受的.


Sve*_*ach 26

该add()方法向集合添加一个元素,但它不会再次返回该集合 - 它返回None.

a = set()
a.add(1)
Run Code Online (Sandbox Code Playgroud)

或更好

a = set([1])
Run Code Online (Sandbox Code Playgroud)

会工作.

  • @Randomblue:如果`set.add()`再次返回该集,我认为如果完全混淆的话.为什么要这样?惯例是:如果它改变了对象,它返回"None".如果它创建一个新对象,则返回新对象.就像它应该的那样. (9认同)
  • 谢谢.这似乎是Python中一个可怕的错误设计.你怎么看? (2认同)

Rik*_*ggi 5

因为add()正在修改你的设置返回None:

>>> empty = set()
>>> print(empty.add(1))
None
>>> empty
set([1])
Run Code Online (Sandbox Code Playgroud)


小智 5

另一种相对简单的方法是:

a = set()
a = set() | {1}
Run Code Online (Sandbox Code Playgroud)

这会在您的集合 a 和以 1 作为元素的集合之间创建一个联合

print(a) 产生 {1} 然后因为 a 现在将具有 a 和 {1} 的所有元素