【问题标题】:Python's += operator and lists [duplicate]Python的+=运算符和列表[重复]
【发布时间】: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 的简写?这是人们所期望的……对此有什么合乎逻辑的解释?

【问题讨论】:

  • += 不仅仅是一条捷径。

标签: python


【解决方案1】:

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

【讨论】:

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