Python +=和=+的区别
一、前言
在Python编程中,有两种常用的方式来给一个变量增加一个值,即x+=a和x=x+a。尽管它们在表达上略有不同,但它们最终都完成了给变量增加一个值的操作。本文将详细解释x+=a和x=x+a的区别,并提供示例来帮助理解。
二、=+和+=的区别
x=3
x+=1
print(x) # x=4
x=3
x=x+1
print(x) # x=4
x=[1,2,3]
x+=[4]
print(x) # x=[1,2,3,4]
x=[1,2,3]
x=x+[4]
print(x) # x=[1,2,3,4]
通过上面例子,我们发现,+=和=+这两种表达方式似乎可以相互替换,但事实并非如此,请看下面的例子:
def fun1(x:list):
x+=[4]
x=[1,2,3]
fun1(x)
print(x) # x=[1,2,3,4]
def fun2(x:list):
x=x+[4]
x=[1,2,3]
fun2(x)
print(x) # x=[1,2,3]
在这里=+与+=出现不同的结果,原因就在于"指针"
我们来看代码执行步骤:
1. 首先,主函数x=[1,2,3]在堆内存中开辟了一个列表空间[1,2,3],并且x指向这个列表
2.接着,调用fun函数,将主函数实参x传入,赋值给fun函数形参x,所以fun函数内的形参x也指向这个列表
2.1 对于fun1 , x+=[4] 直接在x指向的内存上进行自增,改变了这个列表数据,所以调用fun1后,打印x的结果是[1,2,3,4]
2.2 而对于fun2,x=x+[4],这里的x+[4]创建了一个新的列表,而后将新的列表分配给形参x,而主函数中的实参x没有改变,所以调用fun2后,打印x结果为[1,2,3]
三、结论
在一般情况下,x=x+a与x+=a可以等效替换,但是,在遇到非基础数据类型(如list等)的函数传参时,函数内的x=x+a操作会改变形参的指向,而非自增,需要注意这个问题。
补充: 基础数据类型(如int等)是不可变类型,存储在栈内存中而非堆内存,函数调用为值传递并非引用传递,函数内的任何操作与函数外的变量无关,所以没有指针改变指向的问题