举例:
# a += b
>>> a1 = range(3)
>>> a2 = a1
>>> a2 += [3]
>>> a1
[0, 1, 2, 3]
>>> a2
[0, 1, 2, 3]
# a = a + b
>>> a1 = range(3)
>>> a2 = a1
>>> a2 = a2 + [3]
>>> a1
[0, 1, 2]
>>> a2
[0, 1, 2, 3]
a1 = [0, 1, 2]
a1 += [3] <==> a1.__iadd__([3])
print(a1) # [0, 1, 2, 3]
_iadd_方法直接在原对象 a1 上进行更新,该方法的返回值为None
+ 操作调用add方法
a1 = [0, 1, 2]
a1 = a1 + [3] <==> a1 = a1.__add__([3])
_add_方法会返回一个新的对象,原对象不修改,因为这里 a1被重新赋值了,a1指向了一个新的对象
再举一个栗子, 你能判断并明白出下面的输出结果吗?:
In [1]: def selfAdd(a):
...: a += a
...: print(a)
...:
In [2]: a_int = 1
# 传入不可变变量
In [3]: selfAdd(a_int)
2
# 不可变变量本身没有发生改变
In [4]: a_int
Out[4]: 1
In [6]: a_li = [1,2]
# 传入可变变量
In [7]: selfAdd(a_li)
[1, 2, 1, 2]
# += 后,可变变量内容发生改变
In [8]: a_li
Out[8]: [1, 2, 1, 2]
In [5]: def selfAdd2(a):
...: a = a+a
...: print(a)
...:
# 传入不可变变量
In [10]: selfAdd2(a_int)
2
# 如所料的没有改变
In [11]: a_int
Out[11]: 1
# 传入可变变量
In [12]: selfAdd2(a_li)
[1, 2, 1, 2]
# =+ 后,没有发生改变
In [13]: a_li
Out[13]: [1, 2]
这里还要注意:
举例:
In [51]: def count():
...: fs = []
...: for i in range(1,4):
...: def f():
...: return i*i
...: fs.append(f)
...: return fs
...: for f in count():
...: print(f())
...:
9
9
9
第一、可以看到打印结果全是9, 传递时函数的应用或者叫地址(这里 python 是高级语言, 主要面向开发应用的, 其实并不追究底层)
第二、函数中前面声明并定义过程中, 并没有把之前的 i 值保存下来, 循环结束后, 函数中保留的只有最后一次传递进来的值:3
第三、故, 循环调用函数时, 每次打印的都是 3*3 的结果: 9