>>> c = [1, 2, 3]
>>> print(c, id(c))
[1, 2, 3] 43955984
>>> c += c
>>> print(c, id(c))
[1, 2, 3, 1, 2, 3] 43955984
>>> del c
>>> c = [1, 2, 3]
>>> print(c, id(c))
[1, 2, 3] 44023976
>>> c = c + c
>>> print(c, id(c))
[1, 2, 3, 1, 2, 3] 26564048
有什么区别?是+ =和+不应该仅仅是语法糖?
答案 0 :(得分:13)
__iadd__()
等。
调用这些方法来实现增强算术赋值(+=, -=, *=, /=, //=, %=, **=, <<=, >>=, &=, ^=, |=
)。 这些方法应该尝试就地执行操作(修改self
)并返回结果(可能是,但不一定是self
)。如果未定义特定方法,增强赋值将回退到常规方法。例如,要执行语句x += y
,其中x
是具有__iadd__()
方法的类的实例,则会调用x.__iadd__(y)
。
+=
旨在实施就地修改。在简单添加的情况下,创建新对象并使用已使用的名称(c
)标记。
另外,您会注意到+=
运算符的这种行为只能由于列表的可变性而成为可能。整数 - 不可变类型 - 不会产生相同的结果:
>>> c = 3
>>> print(c, id(c))
3 505389080
>>> c += c
>>> print(c, id(c))
6 505389128
答案 1 :(得分:3)
他们不一样
c + = c将c的内容副本附加到c本身
c = c + c用c + c
创建新对象答案 2 :(得分:2)
对于
foo = []
foo+=foo
是foo.extend(foo)
的语法糖(而不是foo = foo + foo
)
在第一种情况下,您只是将列表成员附加到另一个列表中(而不是创建新列表)。
第二种情况下id
更改,因为通过添加两个列表创建了新列表。两者都是相同的并且结果被绑定到相同的标识符而不是一次指向它们是偶然的。
如果用不同的列表(而不是c本身)重新解释这个问题,它可能会变得更加清晰。
答案 3 :(得分:1)
+ =运算符将第二个列表附加到第一个列表,但修改是就地的,因此ID保持不变。
使用+时,会创建一个新列表,最后的“c”是一个新列表,因此它具有不同的ID。
尽管两种操作的最终结果相同。