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
应修改左侧操作数“就地”以将和作为其值。两者都有各自的用途;就地修改可能节省空间,而不可变性可能有利于(例如)并行化。