【问题标题】:Add number to set添加号码进行设置
【发布时间】:2012-03-07 04:19:55
【问题描述】:

我在这里做错了什么?

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

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

【问题讨论】:

  • @CharlesB 如果您要给出答案,那么您应该在答案中这样做。请注意,使用分号是非常不合常理的。 Python 是为了可读性而设计的,将多条语句放在一行中非常不利于可读性。
  • @GarethLatty:他也没有回答这个问题。

标签: python set


【解决方案1】:

在 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()。 此函数从提供的迭代创建一个新列表,对其进行排序 并返回它。

您对该功能的特殊问题来自对创建集合的好方法的误解,而不是语言设计错误。作为 Lattyware points out,在 Python 2.7 及更高版本中,您可以使用集合文字 a = {1} 或按照 Sven Marnach 的 answer 执行 a = set([1])

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

【讨论】:

    【解决方案2】:

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

    a = set()
    a.add(1)
    

    或更好

    a = set([1])
    

    会起作用的。

    【讨论】:

    • 谢谢。这在 Python 中似乎是一个可怕的错误设计。你怎么看?
    • @Randomblue:我认为如果set.add() 再次返回该集合会完全令人困惑。为什么要呢?约定是:如果它改变了对象,它返回None。如果它创建一个新对象,它会返回这个新对象。就像它应该的那样。
    • @RandomBlue:我创建了一个答案来回答您的后续问题。
    【解决方案3】:

    因为add() 正在修改您的集合,返回None

    >>> empty = set()
    >>> print(empty.add(1))
    None
    >>> empty
    set([1])
    

    【讨论】:

      【解决方案4】:

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

      a = set()
      a = set() | {1}
      

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

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

      【讨论】:

        【解决方案5】:

        你应该这样做:

        a = set()
        a.add(1)
        print a
        

        请注意,您将 添加 1 的结果分配给 a,而 Python 中定义的 add 操作返回 None - 这就是得到的结果在您的代码中分配给a

        或者,您可以这样做来初始化一个集合:

        a = set([1, 2, 3])
        

        【讨论】:

          【解决方案6】:

          add 方法更新集合,但返回 None。

          a = set()
          a.add(1)
          print a
          

          【讨论】:

            【解决方案7】:

            您正在将 set().add(1) 返回的值分配给 a。此值为None,因为add() 不返回任何值,而是在列表中原地执行。

            你想做的是这样的:

            a = set()
            a.add(1)
            print(a)
            

            当然,这个例子很简单,但是 Python 确实支持 set literals,所以如果你真的想这样做,最好这样做:

            a = {1}
            print(a)
            

            大括号表示一个集合(尽管要注意,{} 表示一个空字典,而不是空集,因为大括号用于字典和集合(字典用冒号分隔分隔键和值。)

            【讨论】:

              【解决方案8】:

              替代a = set() | {1} 考虑“就地”运算符:

              a = set()
              a |= {1}
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-12-31
                • 2019-07-28
                • 2012-12-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多