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

Posted zxcv1234

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中a+=a和a=a+a的区别相关的知识,希望对你有一定的参考价值。

+= 是 + 的一种升级版本, 具有能把执行后的结果再写回传递来的变量本身的功能, 可变变量自身有比不可变变量多一个魔法方法 _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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
a1 = [0, 1, 2]
a1 += [3] <==> a1.__iadd__([3]) 
print(a1) # [0, 1, 2, 3]
  • 1
  • 2
  • 3

_iadd_方法直接在原对象 a1 上进行更新,该方法的返回值为None 
+ 操作调用add方法

a1 = [0, 1, 2]
a1 = a1 + [3] <==> a1 = a1.__add__([3])
  • 1
  • 2

_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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

=+

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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

这里还要注意:

Python中函数参数是引用传递(不是值传递)。对于不可变类型,因变量不能修改,所以运算不会影响到变量自身;而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量。

举例:

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

第一、可以看到打印结果全是9, 传递时函数的应用或者叫地址(这里 python 是高级语言, 主要面向开发应用的, 其实并不追究底层) 
第二、函数中前面声明并定义过程中, 并没有把之前的 i 值保存下来, 循环结束后, 函数中保留的只有最后一次传递进来的值:3 
第三、故, 循环调用函数时, 每次打印的都是 3*3 的结果: 9

技术分享图片

    • 可变类型,值可以改变: 
      • 列表 list
      • 字典 dict
    • 不可变类型,值不可以改变: 
      • 数值类型 int, long, bool, float
      • 字符串 str
      • 元组 tuple
      • 喜欢的朋友可以加QQ群,群内有免费资料供大家一起交流学习哦!!!技术分享图片





以上是关于python中a+=a和a=a+a的区别的主要内容,如果未能解决你的问题,请参考以下文章

addEventListener和on的区别

python中函数和方法的区别

Python中“物理行”和“逻辑行”的区别。

在Python中,valexec和 compile 有什么区别?

scrapy按顺序启动多个爬虫代码片段(python3)

python中a+=b与a=a+b的区别