python中a+=a和a=a+a的区别

欢迎一起学习研究 python(迎娶白富美!!!): 556993881 += 是 + 的一种升级版本, 具有能把执行后的结果再写回传递来的变量本身的功能, 可变变量自身有比不可变变量多一个魔法方法 _iadd_, += 操作调用 _iadd_方法,没有该方法时,再尝试调用_add_方法, 不可变变量没有_iadd_方法
举例:

# 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]: 1In [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]

这里还要注意:
Python中函数参数是引用传递(不是值传递)。对于不可变类型,因变量不能修改,所以运算不会影响到变量自身;而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量。 【python中a+=a和a=a+a的区别】举例:
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
python中a+=a和a=a+a的区别
文章图片

  • 可变类型,值可以改变:
    • 列表 list
    • 字典 dict
  • 不可变类型,值不可以改变:
    • 数值类型 int, long, bool, float
    • 字符串 str
    • 元组 tuple

    推荐阅读