在Python 2.7中向列表中添加元素

6
>>> A = [1,2,3,4]
>>> D = A
>>> D
[1, 2, 3, 4]
>>> D = D + [5]
>>> A
[1, 2, 3, 4]
>>> C = A
>>> C += [5]
>>> A
[1, 2, 3, 4, 5]

C += [5]为什么会修改A,但D = D + [5]不会呢?

在Python或其他语言中,=+= 有区别吗?


当你使用 D = D + [5] 时,你创建了一个新的列表对象并赋予相同的名称。当你使用 D += [5] 时,你修改了现有的列表。 - Matthias
2
可能是Different behaviour for list.iadd and list.add的重复问题。 - Amadan
1个回答

2
实际上是有区别的。当你使用+=时,你仍然引用同一个对象,但是使用+时,你创建了一个新的对象,而使用=时,则重新分配指向新创建的对象的引用。这在处理函数参数时尤为重要。感谢@Amadan和@Peter Wood澄清此事。

= 不会创建新对象。= 修改名称以引用另一个对象。 - Peter Wood
2
不是 = 创建新对象,而是 +D = D + [5] 调用 D = D.__add__([5])C += [5] 调用 C.__iadd__([5])__add__ 创建新对象,__iadd__ 不会创建新对象;= 只是分配引用。 - Amadan
在这种情况下,你是正确的,但让我们讨论一个更广泛的例子,比如说我们有一个列表 a=[1,2,3],并将其传递给函数 def f(l=a): l=[1,2,3,4]。我们这里没有使用任何 + 运算符,然而全局变量 a 没有被改变。你应该主要关注的是 = 运算符,因为它会创建一个新的引用,就像 @Peter Wood 所说的那样。 - Nhor
@Nhor 我不确定我同意。你打的字越多,就变得越不清楚了(笑)。你的更广泛的例子并没有阐明一个观点。 - Peter Wood
@Amadan说过,重新分配引用的不是=运算符而是+,因此我发布了一个简单的示例,其中没有使用+,但是由于使用了=,因此引用被重新分配。这有什么不清楚的吗? - Nhor
@Nhor:我没有说=重新分配引用。我是说=不会创建新对象。我不知道你如何误解并完全错误引用我。 - Amadan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接