Python';s+;=操作员和列表

Python';s+;=操作员和列表,python,Python,我认为a+=b只是a=a+b的快捷方式。似乎不完全是这样。下面是一个例子: >>> a = [1, 2, 3] >>> b = a >>> b += [4, 5, 6] >>> b [1, 2, 3, 4, 5, 6] >>> a # is also changed [1, 2, 3, 4, 5, 6] 但这是意料之中的: >>> a = [1, 2, 3] >>> b

我认为
a+=b
只是
a=a+b
的快捷方式。似乎不完全是这样。下面是一个例子:

>>> a = [1, 2, 3]
>>> b = a
>>> b += [4, 5, 6]
>>> b
[1, 2, 3, 4, 5, 6]
>>> a # is also changed
[1, 2, 3, 4, 5, 6]
但这是意料之中的:

>>> a = [1, 2, 3]
>>> b = a
>>> b = b + [4, 5, 6]
>>> b
[1, 2, 3, 4, 5, 6]
>>> a # not changed
[1, 2, 3]

现在,我知道当我做
b=a
时,
b
引用与
a
相同的列表,如果我对
b
做一些操作,它们会自动“应用”到
a
(因为它们都指向相同的列表,而且当我做
b=b+[4,5,6]
创建了一个新的列表,然后分配给
b
,但我的问题是…为什么会有这种区别?我的意思是,
a+=b
不应该是
a=a+b
的简写吗?这是人们所期望的…对此的逻辑解释是什么?

a+=b
a的快捷方式
,而不是
a=a+b
。正如您所说,这会创建一个新的列表。

+=
不仅仅是一条捷径。最好指出,这个答案只适用于
a
列表的情况,而不是一般情况。
+=
不是一条捷径;相反,它的实现恰好与
扩展的实现一致
。这就是我实际上要问的。为什么这是列表的预期行为?为什么选择它这样工作?这是那些运算符的“通常”预期行为。
+=
在适当的位置修改对象,
+
创建一个新的对象,即“和”在一般情况下,
a+=b
a.\uu iadd\uuuu(b)
的快捷方式,
a+b
a.\uu添加\uuu(b)的快捷方式
。这就是语言的工作方式。其目的是分离不可变操作和就地突变。
\uuuuuu add\uuuuuu
应该编写,以便结果是一个新对象,它是原始操作数的“和”(无论“和”在类中是什么意思),而
\uuuu iadd\uuuu
应修改左侧操作数“就地”以将和作为其值。两者都有各自的用途;就地修改可能节省空间,而不可变性可能有利于(例如)并行化。