[] .append(x)行为

时间:2014-02-21 10:03:24

标签: python python-3.x

按照我的预期执行:

>>>x=[]
>>>x.append(3)
>>>x
[3]

为什么以下内容返回None?

>>>x = [].append(3)
>>>x
>>>

4 个答案:

答案 0 :(得分:8)

因为list.append更改了列表本身并返回None;)

您可以使用help查看函数或方法的文档字符串:

In [11]: help(list.append)
Help on method_descriptor:

append(...)
    L.append(object) -- append object to end

编辑:

docs of python3中解释了这一点:

某些集合类是可变的。添加,减去或重新排列的方法 他们的成员到位,并没有返回具体项目,永远不会返回 集合实例本身,但None

答案 1 :(得分:4)

如果问题是“为什么x None?”,那么这是因为list.append会像其他人所说的那样返回None

如果问题是“为什么append设计为返回None而不是self?”最后是因为Guido van Rossum的决定,他在这里解释,因为它适用于相关的案例:

https://mail.python.org/pipermail/python-dev/2003-October/038855.html

  

我想再次解释为什么我如此坚定,以至于sort()不应该   回归'自我'。

     

这来自编码风格(在各种其他语言中流行,我   相信特别是Lisp狂热其中的一系列副作用   在单个对象上可以链接如下:

     

x.compress().chop(y).sort(z)

     

相同      

x.compress()
    x.chop(y)
    x.sort(z)

     

我发现链接形式对可读性构成威胁;

简而言之,他不喜欢返回self的方法,因为他不喜欢方法链接。为了防止您链接x.append(3).append(4).append(5)之类的方法,他从None返回append

我推测这可能被认为是区分以下的更一般原则的具体情况:

  • 纯函数,没有副作用和返回值
  • 程序,有副作用但不返回值

当然,Python语言没有做出任何这样的区分,并且Python库不适用一般原则。例如list.pop()有副作用并返回一个值,但由于它返回的值不是(必然)self,因此它不违反GvR更具体的规则。

答案 2 :(得分:1)

列表的append方法返回None。它只修改它所包含的列表。同样会发生:

x = {}.update(a=3)

答案 3 :(得分:1)

方法list.append()更改列表 inplace ,并且不返回任何结果(如果您愿意,则返回None)

列表中的许多列表方法都在原地进行,因此您无需重新分配新列表来覆盖旧列表。

>>> lst = []
>>> id(lst)
4294245644L
>>> lst.append(1)
>>> id(lst)
4294245644L   # <-- same object, doesn't change.

使用[].append(1),您将新添加的列表添加1,并且您没有参考此列表。因此,一旦append完成,您就丢失了列表(并将由垃圾收集器收集) 顺便说一句,有趣的事实,对我的回答有意义:

>>> id([].append(1))
1852276280
>>> id(None)
1852276280