对于加法
+=操作首先会尝试调用对象的 __ iadd__方法,如果没有该方法,那么才会尝试调用__add__方法。
换言之,
- 对于
+号操作,可变对象和不可变对象调用的都是__add__操作; - 对于
+=号操作,可变对象调用__add__,不可变对象调用的是__iadd__(不可变对象没有__iadd__)。__iadd__是原地修改。
>>> a1 = a2 = [1, 2]
>>> b1 = b2 = [1, 2]
>>> a1 += [3] # Uses __iadd__, modifies a1 in-place
>>> b1 = b1 + [3] # Uses __add__, creates new list, assigns it to b1
>>> a2
[1, 2, 3] # a1 and a2 are still the same list
>>> b2
[1, 2] # whereas only b1 was changed对于乘法
a=[20,22]
s=a
s*=2
print('a={0},s={1}'.format(a,s))
print(id(a),id(s))
# a=[20, 22, 20, 22],s=[20, 22, 20, 22]
# 2386940326144 2386940326144
s=s*2
print('a={0},s={1}'.format(a,s))
print(id(a),id(s))
# a=[20, 22, 20, 22],s=[20, 22, 20, 22, 20, 22, 20, 22]
# 2386940326144 2386940328896

发表您的看法