>>> 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或其他语言中,=
和+=
有区别吗?
>>> 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或其他语言中,=
和+=
有区别吗?
+=
时,你仍然引用同一个对象,但是使用+
时,你创建了一个新的对象,而使用=
时,则重新分配指向新创建的对象的引用。这在处理函数参数时尤为重要。感谢@Amadan和@Peter Wood澄清此事。=
不会创建新对象。=
修改名称以引用另一个对象。 - Peter Wood=
创建新对象,而是 +
。D = D + [5]
调用 D = D.__add__([5])
;C += [5]
调用 C.__iadd__([5])
。__add__
创建新对象,__iadd__
不会创建新对象;=
只是分配引用。 - Amadana=[1,2,3]
,并将其传递给函数 def f(l=a): l=[1,2,3,4]
。我们这里没有使用任何 +
运算符,然而全局变量 a
没有被改变。你应该主要关注的是 =
运算符,因为它会创建一个新的引用,就像 @Peter Wood 所说的那样。 - Nhor=
运算符而是+
,因此我发布了一个简单的示例,其中没有使用+
,但是由于使用了=
,因此引用被重新分配。这有什么不清楚的吗? - Nhor=
重新分配引用。我是说=
不会创建新对象。我不知道你如何误解并完全错误引用我。 - Amadan
D = D + [5]
时,你创建了一个新的列表对象并赋予相同的名称。当你使用D += [5]
时,你修改了现有的列表。 - Matthias