Python列表+;list与list.append()的比较

Python列表+;list与list.append()的比较,python,list,Python,List,今天我花了大约20分钟想弄清楚原因 这项工作如期进行: users_stories_dict[a] = s + [b] 但这将有一个None值: users_stories_dict[a] = s.append(b) 有人知道为什么append函数不返回新列表吗?我在寻找做出这一决定的某种合理理由;我现在觉得像是一个Python新手抓住了你 append实际上是通过修改列表来工作的,所以所有的魔力都在于副作用。因此,append返回的结果为无。换句话说,一个人想要的是: s.append(

今天我花了大约20分钟想弄清楚原因 这项工作如期进行:

users_stories_dict[a] = s + [b] 
但这将有一个
None
值:

users_stories_dict[a] = s.append(b)

有人知道为什么append函数不返回新列表吗?我在寻找做出这一决定的某种合理理由;我现在觉得像是一个Python新手抓住了你

append
实际上是通过修改列表来工作的,所以所有的魔力都在于副作用。因此,
append
返回的结果为无。换句话说,一个人想要的是:

s.append(b)

然后:

users\u stories\u dict[a]=s

但是,你已经明白了很多。至于为什么会这样做,虽然我不太清楚,但我猜测可能与指示操作正常进行的
0
(或
false
)退出值有关,如果函数的作用是就地修改其参数,则返回
None
,则表示修改成功

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

append()方法返回一个None,因为它通过添加作为元素附加的对象来修改自己的列表,而
+
操作符连接两个列表并返回结果列表

例如:


因此,正如您所看到的,最简单的方法就是将两个列表添加到一起,就像使用append()将列表b附加到a一样,如果不进行额外的工作,您将无法得到想要的结果

我认为让程序员/读者清楚哪些函数正在改变数据是非常有用的。例如,如果a=b.sort()在您没有预料到的情况下对b进行排序,那将是非常不幸的。正如Alex Martelli所说,
list.append
返回
None
的原因是“命令-查询分离”原则。
append()
没有记录为返回值。是什么让你认为是这样的?你是从哪里知道append返回一个值的?你在哪里读到的哪些文档建议这样做?
users\u stories\u dict[a].extend(b)
btw@Jochen:
users\u stories\u dict[a].extend(b)
只有在
b
是一个iterable时才起作用。假设
b
是一个字符串,比较
a\u list.append(b)
a\u list.extend(b)
。顺便说一句,
list.extend()
也会返回
None
,就像
list.append()
@S.Lott一样公平地说,在函数式编程语言中,list()是不可变的,
.append()
会返回一个新的列表。这不是一个不合理的假设,这个假设简单明了。这也是自己调试它的正确方法。
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]]