Python探究–对比 +与+=
1. 简介
Python中经常用到运算符+
与+=
探究二者区别:
探究a = a + b
和a += b
在过程上有何不同(执行结果是相同的)。
+
对应方法add
或__add__
,前者属于operator模块(Python底层,一些基本数据类型的运算符),后者属于类的魔术方法,用于扩展类的功能。
def __add__(self, *args, **kwargs): # real signature unknown
""" Return self+value. """
pass
- 将 a+b的值作为返回值,返回给a
同理+=
对应的方法为iadd
或__iadd__
。
def __iadd__(self, *args, **kwargs): # real signature unknown
""" Implement self+=value. """
pass
- 计算a+b的值,a指向的内存空间是否变化依据a是否可变而定,可变则不变化,不可变则变化。
2. 分析
由上知对于运算符+
,执行后返回结果,需要对象接收。举个例子:a = a + b
,所以不管数据类型是否可变,两个a
的id必然不同。
def add_test():
# a = a+b
obj = "a"
mut = ["a"]
print("immutable obj id before add: ", id(obj))
print("mutable obj id before add: ", id(mut))
obj = obj + "a"
mut = mut + ["a"]
print("immutable obj id after add: ", id(obj))
print("mutable obj id after add: ", id(mut))
add_test()
immutable obj id before add: 140395280603376
mutable obj id before add: 140395281045512
immutable obj id after add: 140395280140808
mutable obj id after add: 140395280179144
- 如上所示,可变类型与不可变类型在执行
a = a + b
后a的内存空间均发生变化。
那么对于表达式a += b
呢
def iadd_test():
# a += b
obj = "a"
mut = ["a"]
print("immutable obj id before iadd: ", id(obj))
print("mutable obj id before iadd: ", id(mut))
obj += "a"
mut += ["a"]
print("immutable obj id after iadd: ", id(obj))
print("mutable obj id after iadd: ", id(mut))
iadd_test()
immutable obj id before iadd: 140395280603376
mutable obj id before iadd: 140395280179144
immutable obj id after iadd: 140395280140808
mutable obj id after iadd: 140395280179144
- 对于可变类型,a指向的内存空间不变
- 对于不可变类型,a指向的内存空间变化。