【问题标题】:Why does append() always return None in Python? [duplicate]为什么 append() 在 Python 中总是返回 None? [复制]
【发布时间】:2020-09-11 14:40:31
【问题描述】:
list = [1, 2, 3]
print(list.append(4))   ## WRONG, print does not work, append() returns None

## RIGHT:
list.append(4)
print(list)  ## [1, 2, 3, 4]

我正在学习 Python,但我不确定这个问题是否特定于语言以及append 在 Python 中是如何实现的。

【问题讨论】:

  • 首先,打印附加操作的结果。如果 append() 成功完成,则返回“None”,如遇到的问题:None
  • append 将返回 None 如果它工作。仅此而已。
  • 啊,如果原始代码中的注释提到appendvoid 函数,那将更容易理解(至少对我而言)。这是有道理的,谢谢。
  • 大多数标准库使用的约定是,如果一个方法应该就地改变对象,那么它应该返回@ 987654328@。在少数例外情况下,遵循此规则会使代码更难使用(list.pop 就是一个例子)。但这些绝对是例外,而不是规则。
  • This question 与您提出的问题非常相似。也可以在那里查看答案。

标签: python list append nonetype


【解决方案1】:

append 是一个变异(破坏性)操作(它修改列表而不是返回一个新列表)。进行append 的非破坏性等效操作的惯用方法是

l = [1,2,3]
print l + [4] # [1,2,3,4]
print l # [1,2,3]

回答你的问题,我猜如果append返回新修改的列表,用户可能会认为它是非破坏性的,即他们可能会编写类似的代码

m = l.append("a")
n = l.append("b")

并期望n[1,2,3,"b"]

【讨论】:

    【解决方案2】:

    在 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 3.3 开始,现在更多的是 explicitly documented

    一些集合类是可变的。加法、减法、 或重新安排他们的成员,并且不返回特定项目, 永远不要返回集合实例本身,而是 None

    此设计决策背后的设计和历史常见问题解答gives the reasoning(关于列表):

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

    在性能很重要的情况下,制作列表的副本 只是为了排序会很浪费。因此,list.sort() 对 清单到位。为了提醒你这个事实,它不会返回 排序的列表。这样你就不会不小心上当了 当您需要排序副本但还需要保留时覆盖列表 周围未排序的版本。

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

    【讨论】:

      【解决方案3】:

      一个建议是避免使用关键字或函数作为变量名。在上面的代码中,您使用 list 作为变量:

      list = [1, 2, 3]
      

      我建议不要使用list 作为变量名,因为list 实际上已经定义为内置类型。正如 ChaseTheSun 和 squiguy 指出的那样,没有更多的东西了

      lst = [1, 2, 3]
      lst.append(4)
      print(lst)  ## [1, 2, 3, 4]
      

      【讨论】:

      • 小写 L 作为变量名也不好,因为它看起来太像数字 1。我喜欢使用 lst
      【解决方案4】:

      list.append() 是一个就地操作,意味着它修改了list 的状态,而不是返回一个新的list 对象。

      Python 中的所有函数都返回 None,除非它们明确返回其他内容。 a.append() 方法修改了a 本身,这意味着没有什么可以返回。

      查看此行为的另一种方式是sorted(some_list)some_list.sort() 之间的差异。

      如果您不想将"x" 附加到a,则需要使用第二个sn-p,或者您可以简单地连接:

      >>> a = [1, 2, 3, 4]
      >>> b = a[1:] + ["x"]
      >>> b
      [2, 3, 4, 'x']
      

      进一步澄清:

      >>> a = [1, 2, 3, 4]
      >>> b = a[1:].append("x")
      >>> a
      [1, 2, 3, 4]
      >>> a[1:]
      [2, 3, 4]
      >>> type(b)
      <class 'NoneType'>
      

      注意bNone,因为list.append() 方法返回None。另请注意,a 实际上并未被修改。这是因为您附加到a 的切片,但实际上并未将该切片保存在任何地方。注意如果你这样做a.append("x")会发生什么:

      >>> b = a.append("x")
      >>> a
      [1, 2, 3, 4, 'x']
      >>> type(b)
      <class 'NoneType'>
      

      b 仍然是 None,但现在 a 已被修改。

      【讨论】:

        【解决方案5】:

        它不返回任何东西。它附加/添加到变量,看看你应该使用第一个用于附加打印的变量

        friends=["Rajendra V"]
        friends.append("John")
        print(friends)
        

        【讨论】:

          猜你喜欢
          相关资源
          最近更新 更多