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+=ba.extend(b) 的快捷方式,而不是 a=a+b .. 正如您所说,它会创建一个新列表。

【讨论】:

可能会很好地指出这个答案只适用于alist,而不是一般情况。 += 不是捷径;相反,它的实现恰好与extend 的实现一致。 这实际上是我要问的。 为什么这是列表的预期行为?为什么选择这样工作? 这是这些运算符的“通常”预期行为。 += 就地修改对象,+ 创建一个新对象,它是两者的“总和”。 一般情况下,a += ba.__iadd__(b) 的快捷方式,a + ba.__add__(b) 的快捷方式。这就是语言的工作方式。目的是将不可变操作和就地突变分开。 __add__ 应该这样写,结果是一个新对象,它是原始操作数的“总和”(无论“总和”在类中意味着什么),而 __iadd__ 应该修改左侧操作数“就地”以将总和作为其值。两者都有其用途;就地修改可以节省空间,而不变性可能有利于(例如)并行化。

以上是关于Python的+=运算符和列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中使用 + 和 += 运算符进行连接 [重复]

为啥python列表在使用=运算符时会像这样[重复]

集合的定义,操作及运算 (Python)

Python:集合函数三元运算符

Python列表基础

python基础之数字字符串列表元组字典