我在这里做错了什么?
a = set().add(1)
print a # Prints `None`
我试图将数字1
添加到空集。
答案 0 :(得分:61)
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中是一个可怕的错误设计”,但是这个设计决定背后的设计和历史常见问题gives the reasoning(关于列表):
为什么不
list.sort(
)返回排序列表?在表现很重要的情况下,制作一份清单副本 只是为了排序它会很浪费。因此,
list.sort()
对此进行排序 列表到位。为了提醒你这个事实,它不会回来 排序清单。这样,你就不会被意外愚弄 在需要排序副本时覆盖列表但也需要保留 未分类的版本。在Python 2.4中添加了一个新的内置函数 -
sorted()
。 此函数从提供的iterable中创建一个新列表,对其进行排序 并将其归还。
您对此功能的特殊问题来自于对创建集合而不是语言错误设计的好方法的误解。作为Lattyware points out,在Python 2.7及更高版本中,您可以按照Sven Marnach的answer使用集合文字a = {1}
或a = set([1])
。
顺便说一句,我喜欢Ruby在变异对象的方法之后放置感叹号的惯例,但我发现Python的方法是可以接受的。
答案 1 :(得分:26)
add()
方法向集合添加元素,但它不会再次返回集合 - 它返回None
。
a = set()
a.add(1)
或更好
a = set([1])
会起作用。
答案 2 :(得分:5)
由于add()
正在修改您的设置,因此返回None
:
>>> empty = set()
>>> print(empty.add(1))
None
>>> empty
set([1])
答案 3 :(得分:3)
另一种相对简单的方法是:
a = set()
a = set() | {1}
这会在集合a和集合之间创建一个联合,其中1为元素
print(a)产生{1}然后因为a现在具有a和{1}的所有元素
答案 4 :(得分:2)
你应该这样做:
a = set()
a.add(1)
print a
请注意,您正在为a
分配添加 1
的结果,而add
操作(如Python中所定义)将返回{{1} - 这就是你的代码中分配给None
的内容。
或者,您可以执行此操作来初始化集合:
a
答案 5 :(得分:2)
add方法更新集合,但返回None。
a = set()
a.add(1)
print a
答案 6 :(得分:2)
您正在将set().add(1)
返回的值指定给a。此值为None
,因为add()
不返回任何值,而是在列表中就地执行。
你想做的是:
a = set()
a.add(1)
print(a)
当然,这个例子很简单,但Python确实支持set literals,所以如果你真的想这样做,最好这样做:
a = {1}
print(a)
花括号表示一个集合(虽然被警告,{}
表示一个空的dict,而不是一个空集,因为大括号和集合都使用了大括号(dicts是通过使用冒号分隔键和值。)
答案 7 :(得分:2)
替代a = set()| {1}考虑"就地"操作者:
a = set()
a |= {1}