今天我花了大约20分钟尝试弄清楚为什么这个能够如预期般工作:
users_stories_dict[a] = s + [b]
但这将具有 None
值:
users_stories_dict[a] = s.append(b)
有人知道为什么append函数不会返回新列表吗?我希望能够找到一些合理的原因来解释这个决定,因为目前看起来像是Python初学者的陷阱。
append
实际上是通过修改列表来工作的,所以所有的魔力都在副作用中。因此,append
返回的结果是 None。换句话说,我们想要的是:
s.append(b)
然后:
users_stories_dict[a] = s
但是,你已经发现了这一点。至于为什么会这样做,虽然我不太确定,但我猜可能与一个 0
(或者false
)退出值表示操作正常进行有关,通过返回 None
用于那些其作用是就地修改它们的参数的函数,你报告修改成功。
但我同意如果它能返回修改后的列表会更好。至少,Python 在所有这样的函数中的行为都是一致的。
list.append
返回 None
的原因是 "命令查询分离" 原则,正如 Alex Martelli 在此处所说[https://dev59.com/iHI-5IYBdhLWcg3wxbjv]。 - tzotappend() 方法返回的是 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上,如果没有额外的工作,您也无法得到想要的结果。
append()
并没有被记录为返回一个值。是什么让你认为它会返回一个值?你从哪里得到的append返回一个值的想法?你在阅读哪份文档时看到了这样的说法? - S.Lottusers_stories_dict[a].extend(b)
扩展用户故事字典。 - Jochen Ritzelb
是可迭代对象,那么users_stories_dict[a].extend(b)
才能起作用。假设b
是一个字符串,请比较a_list.append(b)
和a_list.extend(b)
。顺便说一句,list.extend()
也像list.append()
一样返回None
。 - tzot.append()
返回一个新的列表。这并不是一个不合理的假设。 - rbp