0. 可变对象,不可变对象
-
list 是可变对象:
-
tuple,int 等是不可变对象
-
+= 会首先调用对象的
.__iadd__
方法,对对象本身进行修改,无返回值;如果对象为不可变对象,则会继续调用其.__add__
方法,返回操作后的结果;__iadd__ in dir(tuple)
⇒ False__iadd__ in dir(list)
⇒ True__iadd__ in dir(int)
⇒ False
-
对于不可变对象 a(如 tuple 或 int),a += b 与 a = a + b 等价;
>> x = (1, 2) >> id(x) 4460706120 >> x += (3, ) (1, 2, 3) >> x >> id(x) 4438616104
1. 举例
-
x += 1:in-place(就地)修改 x 自身的值,前提 x 必须是可变对象;
-
x = x + 1
会隐式地创建一个新的对象,表示 x 与 1的和,同时用同样的 name 指向它,所以它的含义和
y = x+1
相同,只不过这里将y
取名为x
罢了;
当我们用多个变量名指向同一对象实体时,可能对比会更加明显:
>> y = x = []
>> x += [5]
>> x
[5]
>> y
[5]
>> x = x + [5]
>> x
[5, 5]
>> y
[5]
以下是关于 +
与+=
运算符重载(magic method)的说明
+
:调用__add__
,不修改它的两个操作数+=
:调用__iadd__
,会修改它自身的值
注:表达式本身是没有返回值的,如x = 1
,甚至不会返回 None,y = x = 1
含义不是y = (x = 1)
,而是 y
和 x
指向相同的1
所在的内存对象。
如此我们也可理解 Python 下简洁的 swap:
x, y = y, x
是将 x 指向 原始的 y,y 指向 原始的 x,也即可简单理解为同时发生,而不是:
x = y
y = x
# 走的就是C/C++ swap 的老路了
# 需要借助中间变量
references
[1] <a href=“http://stackoverflow.com/questions/12905338/python-difference-between-x-x1-and-x-1/12905374”, target="_blank">Python Difference between x = x+1 and x += 1