【问题标题】:Python list + list vs. list.append()Python list + list 与 list.append()
【发布时间】:2011-08-01 03:58:28
【问题描述】:

今天我花了大约 20 分钟试图找出原因 这按预期工作:

users_stories_dict[a] = s + [b] 

但这会有一个None 值:

users_stories_dict[a] = s.append(b)

有人知道为什么 append 函数不返回新列表吗?我正在寻找做出这个决定的某种合理原因;现在对我来说,它看起来像是一个 Python 新手。

【问题讨论】:

  • append() 未记录为返回值。是什么让你认为它做到了?您从哪里得到 append 返回值的想法?您阅读的哪些文档表明了这种情况?
  • users_stories_dict[a].extend(b)顺便说一句
  • @Jochen: users_stories_dict[a].extend(b) 仅在 b 是可迭代的情况下才有效。假设b 是一个字符串,比较a_list.append(b)a_list.extend(b)。顺便说一句,list.extend() 也像 list.append() 一样返回 None
  • @S.Lott 公平地说,在函数式编程语言中,list() 是不可变的,.append() 返回一个新列表。这不是一个不合理的假设。

标签: python list


【解决方案1】:

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

s.append(b)

然后:

users_stories_dict[a] = s

但是,你已经想通了。至于为什么这样做,虽然我真的不知道,但我的猜测是它可能与0(或false)退出值有关,表明操作正常进行,并通过返回None 对于其作用是就地修改其参数的函数,您报告修改成功。

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

【讨论】:

  • 我认为让程序员/读者清楚哪些函数正在改变数据是非常有用的。例如,如果你没想到 a = b.sort() 对 b 进行排序,那将是非常不幸的。
  • list.append 返回None 的原因是“命令-查询分离”原则,正如 Alex Martelli 所说的here
【解决方案2】:

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 中,如果没有额外的工作,您也不会得到您想要的结果

【讨论】:

  • 这个简单明了。自己调试也是正确的方法。
猜你喜欢
  • 2011-04-07
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 2013-07-25
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
相关资源
最近更新 更多