添加号码进行设置

发布于 2021-01-29 18:27:26

我在这里做错了什么?

a = set().add(1)
print a # Prints `None`

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

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    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中的可怕错误设计”,但是“设计和历史记录”
    FAQ给出了此设计决定背后的原因(相对于列表):

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

    在性能很重要的情况下,仅对列表进行排序会造成浪费。因此,list.sort()将列表排序到位。为了提醒您这一事实,它不会返回已排序的列表。这样,当您需要已排序的副本但还需要保留未排序的版本时,您不会被愚蠢地误覆盖列表。

    在Python 2.4中,添加了一个新的内置函数– sorted()。此函数根据提供的可迭代对象创建一个新列表,对其进行排序并返回。

    您对该功能的特殊问题来自对创建集合的好方法的误解,而不是语言设计错误。正如Lattyware指出的那样,在Python
    2.7及更高版本中,您可以使用set常量a = {1}a = set([1])按照Sven
    Marnach的答案进行操作。
    该add()方法将元素添加到集合中,但不会再次返回集合-它返回None。

    a = set()
    a.add(1)
    

    或更好

    a = set([1])
    

    会工作。

    顺便说一句,我喜欢Ruby的约定,即在使对象变异的方法之后放置一个感叹号,但我发现Python的方法可以接受。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看