在python中大部分情况下,a = a+b和a += b效果是相同的。
但也有特殊情况,对于可变类型(列表,字典等),a = a+b和a += b的效果可能不同。
-
a = a + b
+ 和 - 是一个二元操作符,它会创建一个新列表,包含a和b的元素。然后让变量a引用这个新对象
a = [1, 2, 3]
b = [4, 5, 6]
c = a#c和a引用同一个对象
print("a id:%s %s" %(id(a), a))
print("b id:%s %s" %(id(b), b))
print("c id:%s %s" %(id(c), c))
#a = a + b
a = a + b
print("a = a + b")
print("a id:%s %s" %(id(a), a))
print("b id:%s %s" %(id(b), b))
print("c id:%s %s" %(id(c), c))
#output
a id:2106053105344 [1, 2, 3]
b id:2106053105216 [4, 5, 6]
c id:2106053105344 [1, 2, 3]
a = a + b
a id:2106055605568 [1, 2, 3, 4, 5, 6]#与原a地址不同,创建了一个新的对象
b id:2106053105216 [4, 5, 6]
c id:2106053105344 [1, 2, 3]
-
a += b
+= 和 -= 是就地操作符,它会就地修改a所引用的对象,在a中添加b的元素,而不是创建一个新对象。
a = [1, 2, 3]
b = [4, 5, 6]
c = a
print("a id:%s %s" %(id(a), a))
print("b id:%s %s" %(id(b), b))
print("c id:%s %s" %(id(c), c))
#a += b
a += b
print("a += b")
print("a id:%s %s" %(id(a), a))
print("b id:%s %s" %(id(b), b))
print("c id:%s %s" %(id(c), c))
#output
a id:2106052498304 [1, 2, 3]
b id:2106051734976 [4, 5, 6]
c id:2106052498304 [1, 2, 3]
a += b
a id:2106052498304 [1, 2, 3, 4, 5, 6]#与原a地址相同,直接修改了原a对象
b id:2106051734976 [4, 5, 6]
c id:2106052498304 [1, 2, 3, 4, 5, 6]#与原a引用同一个对象,所以原a改变,c也跟着改变