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

2018-01-20  本文已影响530人  bad_boy

Python中的数据结构分为可变(mutable)和不可变(immutable):

可变类型,值可以改变:

• 列表 list

• 字典 dict

不可变类型,值不可以改变:

• 数值类型 int, long, bool, float

• 字符串 str

• 元组 tuple

对于可变类型,=和+=有着明显的不同,如list:

+表示连接操作,+=表示追加

对于不可变类型,=和+=就是一样的操作,如上面的tuple

可变类型与不可变类型的本质在于内存空间是否可变~

更具体的说就是:

a=a+b是先创建一个新的对象并让变量a引用这个对象,a+=b是让a所引用的对象的值变成a+b的值。

+= 是 + 的一种升级版本, 具有能把执行后的结果再写回传递来的变量本身的功能, 可变变量自身有比不可变变量多一个魔法方法 _iadd_, += 操作调用 _iadd_方法,没有该方法时,再尝试调用_add_方法, 不可变变量没有_iadd_方法

例子:

def selfAdd(a):

    a = a + a

    # a += a #这两句话是不同的,在函数里面。

def selfAdd1(a):

    a += a

a_list = [1, 2]

selfAdd(a_list)

print(a_list)

b_list = [1, 2]

selfAdd1(b_list)

print(b_list)

输出结果:

import dis

print(dis.dis(selfAdd))

#输出结果:

0 LOAD_FAST                0 (a)

3 LOAD_FAST                0 (a)

6 BINARY_ADD            #区别在这里

7 STORE_FAST              0 (a)

10 LOAD_CONST              1 (None)

13 RETURN_VALUE

None

print(dis.dis(selfAdd1))

#输出结果:

0 LOAD_FAST                0 (a)

3 LOAD_FAST                0 (a)

6 INPLACE_ADD         #原地加

7 STORE_FAST              0 (a)

10 LOAD_CONST              1 (None)

13 RETURN_VALUE

None

参考:

https://segmentfault.com/q/1010000009754631?sort=created

http://blog.csdn.net/xinxinNoGiveUp/article/details/78442200

上一篇下一篇

猜你喜欢

热点阅读