python - 当 b 是列表时,为什么 b+=(4,) 有效,而 b = b + (4,) 无效?

标签 python python-3.x list tuples

如果我们采用 b = [1,2,3] 并尝试执行:b+=(4,)

它返回b = [1,2,3,4],但如果我们尝试执行b = b + (4,),它不起作用。

b = [1,2,3]
b+=(4,) # Prints out b = [1,2,3,4]
b = b + (4,) # Gives an error saying you can't add tuples and lists

我预计 b+=(4,) 会失败,因为您无法添加列表和元组,但它有效。所以我尝试了 b = b + (4,) 期望得到相同的结果,但没有成功。

最佳答案

“为什么”问题的问题在于它们通常可能意味着多种不同的事情。我会尽力回答您可能想到的每一个问题。

“为什么它可以以不同的方式工作?”,例如可以回答: this 。基本上,+=尝试使用对象的不同方法:__iadd__(仅在左侧检查),与__add__+__radd__ (“反向添加”,如果左侧没有 __add__,则在右侧检查) .

“每个版本到底做什么?” 简而言之,list.__iadd__ 方法与 list.extend 执行相同的操作(但由于语言设计的原因,仍然有一个作业返回)。

这也意味着例如

>>> a = [1,2,3]
>>> b = a
>>> a += [4] # uses the .extend logic, so it is still the same object
>>> b # therefore a and b are still the same list, and b has the `4` added
[1, 2, 3, 4]
>>> b = b + [5] # makes a new list and assigns back to b
>>> a # so now a is a separate list and does not have the `5`
[1, 2, 3, 4]

+ 当然会创建一个新对象,但明确需要另一个列表,而不是尝试从不同的序列中提取元素。

“+=这样做为什么有用?效率更高;extend方法不必创建新对象。当然,这个有时会产生一些令人惊讶的效果(如上所示),并且通常 Python 并不是真正关注效率,但这些决定是很久以前做出的。

“不允许使用 + 添加列表和元组的原因是什么?” 请参阅 here (谢谢@splash58);一种想法是 (tuple + list) 应该产生与 (list + tuple) 相同的类型,并且不清楚结果应该是什么类型。 += 不存在这个问题,因为 a += b 显然不应该改变 a 的类型。

关于python - 当 b 是列表时,为什么 b+=(4,) 有效,而 b = b + (4,) 无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58259682/

相关文章:

python - 在Python中调整时间列表的开始和结束范围

android - 如何使用 python 中的 GMT 增量从时间戳获取日期时间对象?

html - 不显示列表图标(光盘)并有滚动条

java - 为什么它不将元素放在新列表的字符串中?

python - 我使用 TFLiteConvert post_training_quantize=True 但我的模型仍然太大,无法托管在 Firebase ML Kit 的自定义服务器中

python - 如何仅列出 Python 中最底层的目录?

python - 我需要导航网页及其子页面链接中的每个链接

python-3.x - 如何使用 pandas 中的条件从两个 SQLite 表创建 Excel 文件?

python - Zip 文件破解器 python 3 将仅在文本文件末尾使用密码

r - R 中的 lapply 函数可以返回命名列表吗?