一、= 赋值
=是一个运算符,表示把=右边的值,赋值给左边。其实,这个赋值过程,只是把,右边值在内存中的地址,赋值给了左边。代码支持:
lst1 = ['a', 'b', [1, 2]] lst2 = lst1 print(id(lst1),id(lst2)) lst1.append('c') print(lst1) print(lst2) 结果: 997818360456 997818360456 ['a', 'b', [1, 2], 'c'] ['a', 'b', [1, 2], 'c'] 997818362120 997818362120 ['a', 'b', [1, 2, 3], 'c'] ['a', 'b', [1, 2, 3], 'c']
可以看出,lst2把lst1的所有值都得到了。上一张图,帮助理解。
二、深浅拷⻉
- 浅拷贝
谈到浅拷贝,就会出现一个方法---copy(),这个方法就是把对象进行浅拷贝的。
适用于list列表,set集合,dict字典,其他数据,没有此方法。代码展示一下,copy前后的结果。
lst1 = ['a', 'b', [1, 2]] lst2 = lst1.copy() lst1[2].append(3) lst1.append('c') print(id(lst1)) print(id(lst2)) print(id(lst1[2])) print(id(lst2[2])) print(lst1) print(lst2) 结果: 219912462984 219912465352 474036693256 474036693256 ['a', 'b', [1, 2, 3], 'c'] ['a', 'b', [1, 2, 3]]
由上面程序输出的结果可以得到一个结论,复制后,lst2和lst1不一样了,拥有了自己的内存空间,地址是:219912465352。但是[1,2],这个列表中的元素的地址却被复制到lst2中了,所以在结尾追加3时,lst2中也打印出3。由地址,也可以看出,两者是一样的地址。
画了一张图,如下:
- 深度拷贝(深度克隆,原型模式)
深度拷贝,使用与几乎所有数据类型。会把所有的内容进行拷贝,包括第二层,第三层等。看代码说话:
import copy lst1 = ['a', 'b', [1, 2]] lst2 = copy.deepcopy(lst1) print(id(lst1), id(lst2)) print(id(lst1[2]), id(lst2[2])) print(lst2) print(lst1) lst1.append('c') lst1[2].append(3) print(lst2) print(lst1) 结果: 876803976200 876805465224 876803976136 876805465416 ['a', 'b', [1, 2]] ['a', 'b', [1, 2]] ['a', 'b', [1, 2]] ['a', 'b', [1, 2, 3], 'c']
使用深度拷贝时,需要导包,import copy。可以看出lst1和lst2在内存中的地址不一样了,而且,里面的元素[1,2],列表在内存中的地址也不一样了。因此,无论后面lst1怎么追加数据,都不会影响到lst2。可以通过下图,再次理解一下。