按照我的预期执行:
>>>x=[]
>>>x.append(3)
>>>x
[3]
为什么以下内容返回None?
>>>x = [].append(3)
>>>x
>>>
答案 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