Python列表 + 列表 vs. 列表.append()

6

今天我花了大约20分钟尝试弄清楚为什么这个能够如预期般工作:

users_stories_dict[a] = s + [b] 

但这将具有 None 值:

users_stories_dict[a] = s.append(b)

有人知道为什么append函数不会返回新列表吗?我希望能够找到一些合理的原因来解释这个决定,因为目前看起来像是Python初学者的陷阱。


1
append()并没有被记录为返回一个值。是什么让你认为它会返回一个值?你从哪里得到的append返回一个值的想法?你在阅读哪份文档时看到了这样的说法? - S.Lott
users_stories_dict[a].extend(b)扩展用户故事字典。 - Jochen Ritzel
@Jochen:如果b是可迭代对象,那么users_stories_dict[a].extend(b)才能起作用。假设b是一个字符串,请比较a_list.append(b)a_list.extend(b)。顺便说一句,list.extend()也像list.append()一样返回None - tzot
@S.Lott 公平地说,在函数式编程语言中,列表是不可变的,.append() 返回一个新的列表。这并不是一个不合理的假设。 - rbp
2个回答

12

append 实际上是通过修改列表来工作的,所以所有的魔力都在副作用中。因此,append 返回的结果是 None。换句话说,我们想要的是:

s.append(b)

然后:

users_stories_dict[a] = s

但是,你已经发现了这一点。至于为什么会这样做,虽然我不太确定,但我猜可能与一个 0(或者false)退出值表示操作正常进行有关,通过返回 None 用于那些其作用是就地修改它们的参数的函数,你报告修改成功。

但我同意如果它能返回修改后的列表会更好。至少,Python 在所有这样的函数中的行为都是一致的。


7
让程序员/读者清楚地知道哪些函数会改变数据是非常有用的。例如,如果你没有预料到的话,a = b.sort() 会改变b的排序结果,这将是非常不幸的。 - Mike Axiak
3
list.append 返回 None 的原因是 "命令查询分离" 原则,正如 Alex Martelli 在此处所说[https://dev59.com/iHI-5IYBdhLWcg3wxbjv]。 - tzot

9

append() 方法返回的是 None,因为它通过将添加的对象作为元素添加到列表中来修改列表本身,而 + 运算符则将两个列表连接起来并返回结果列表。

例如:

a = [1,2,3,4,5]
b = [6,7,8,9,0]

print a+b         # returns a list made by concatenating the lists a and b
>>> [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

print a.append(b) # Adds the list b as element at the end of the list a and returns None
>>> None

print a           # the list a was modified during the last append call and has the list b as last element
>>> [1, 2, 3, 4, 5, [6, 7, 8, 9, 0]]

因此,您可以看到最简单的方法就是将这两个列表相加。即使您使用append()将列表b附加到列表a上,如果没有额外的工作,您也无法得到想要的结果。


这个很简单明了。这也是自己调试的正确方式。 - fchen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接