Python变量的赋值、引用传递、值传递

首先说明一点,Python赋值没有值传递,只有引用传递,只要是出现赋值符号 = 就是引用传递。
>>> a = 1
>>> b = a
>>> a = 2
>>> b
>>> 1
修改a,b并没有发生变化,然后看下面的:
>>> a = {'name': 'killer', 'age':24}
>>> b = a
>>> del a['name']
>>> b
>>> {'age': 24}
可以看到修改a的同时,b也被修改了,之所以出现两种不同的情况,是因为两种操作是不同的性质,第一种对a进行重新赋值,a会指向新的内存地址,b还是指向a原来的内存地址,所以b不变,第二种,对a进程del操作,因为b指向的是同一个内存地址,所以,b也会发生变化。如果不理解,继续看下面的例子:
a = 1
print(id(a))
b = a
print(id(b))
a = 2
print(id(a))
print(id(b))
运行这段代码,可以看到:
40991336
40991336
40991324
40991336
在对b进行赋值的时候,a和b指向的是同一块内存地址,当执行a = 2的时候,会将a原来的指向删除,重新指向2这个对象,所以a指向的内存地址发生了变化,但是此时b的指向没有变化,内存地址依旧指向a原来的地址。 如果赋值只能使用引用传递的话,那么就会出现问题,如果我需要复制一份当前对象,然后对原来的对象进行操作的话,该怎么办?Python有解决的办法,就是使用copy模块复制一份新的对象。简单如下:
>>> import copy
>>> a = {'name': 'killer', 'age':24}
>>> b = copy.copy(a)
>>> del a['name']
>>> b
>>> {'name': 'killer', 'age':24}
PS:说到copy模块,还有个“坑”,copy模块还有浅copy和深copy。