Python的+=运算符和列表[重复]
Posted
技术标签:
【中文标题】Python的+=运算符和列表[重复]【英文标题】:Python's += operator and lists [duplicate] 【发布时间】:2014-03-03 12:09:32 【问题描述】:我虽然 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
的简写?这是人们所期望的……对此有什么合乎逻辑的解释?
【问题讨论】:
+=
不仅仅是一条捷径。
【参考方案1】:
a+=b
是 a.extend(b)
的快捷方式,而不是 a=a+b
.. 正如您所说,它会创建一个新列表。
【讨论】:
可能会很好地指出这个答案只适用于a
是list
,而不是一般情况。
+=
不是捷径;相反,它的实现恰好与extend
的实现一致。
这实际上是我要问的。 为什么这是列表的预期行为?为什么选择这样工作?
这是这些运算符的“通常”预期行为。 +=
就地修改对象,+
创建一个新对象,它是两者的“总和”。
一般情况下,a += b
是a.__iadd__(b)
的快捷方式,a + b
是a.__add__(b)
的快捷方式。这就是语言的工作方式。目的是将不可变操作和就地突变分开。 __add__
应该这样写,结果是一个新对象,它是原始操作数的“总和”(无论“总和”在类中意味着什么),而 __iadd__
应该修改左侧操作数“就地”以将总和作为其值。两者都有其用途;就地修改可以节省空间,而不变性可能有利于(例如)并行化。以上是关于Python的+=运算符和列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章