如果我们采用 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/