**1.变量不是盒子**
在python中,变量不是一个盒子,当赋值运算发生时,python并不是将数据放到变量里边去,而是将变量与数据进行挂钩,这个行为我们称之为引用。
将一个变量赋值给另一个变量其实就是将一个变量的引用传递给另一个变量。
>>> x = [1, 2, 3]
>>> y = x
>>> x[1] = 1
>>> x
[1, 1, 3]
>>> y
[1, 1, 3]
[此时修改x的值,y的值也会随之改变]
**2.浅拷贝**
调用列表的copy方法
>>> x = [1, 2, 3]
>>> y = x.copy()
>>> x[1] = 1
>>> x
[1, 1, 3]
>>> y
[1, 2, 3]
[copy方法拷贝的是整个列表对象,而不仅仅是变量的引用]
利用切片的方法也可以实现拷贝的效果
>>> x = [1, 2, 3]
>>> y = x[:]
>>> x[1] = 1
>>> x
[1, 1, 3]
>>> y
[1, 2, 3]
浅拷贝方法无法处理嵌套列表
>>> x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> y = x.copy()
>>> x[1][1] = 0
>>> x
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
>>> y
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
[浅拷贝只是拷贝了外层的对象,如果包含嵌套对象的话,只是其引用]
**3.copy模板**
有两个函数,copy实现的是浅拷贝,deepcopy实现的是深拷贝。
copy
>>> import copy
>>> x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> y = copy.copy(x)
>>> x[1][1] = 0
>>> x
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
>>> y
[[1, 2, 3], [4, 0, 6], [7, 8, 9]],
deepcopy
>>> x = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> y = copy.deepcopy(x)
>>> x[1][1] = 0
>>> x
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
>>> y
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[deepcopy将原对象拷贝的同时,也将对象中所有引用的子对象一并进行了拷贝
如果存在多层嵌套的话,深拷贝也会360度无死角地拷贝每一层嵌套里面的数据。]
默认使用的是浅拷贝,因为效率,深拷贝需要更多空间,浅拷贝只要复制地址就行了 |