目录
- =
- copy.copy浅拷贝
- copy.deepcopy深拷贝
- 总结
lis=[1,2,3,[4,5]]
拷贝的都是可变对象类型 , 不可变对象类型,没有被拷贝的说法,即便是用深拷贝,查看id的话也是一样的,如果对其重新赋值,也只是新创建一个对象,替换掉旧的而已。
一句话就是,不可变类型,不管是深拷贝还是浅拷贝,地址值和拷贝后的值都是一样的。
1. =
这个基本上算不上拷贝 , 只是将值得引用计数加了1而已
a=lis
现在只不过是将a也指向这个列表的内存地址了
lis=[1,2,3,[1,2,3]]
a=lis
lis.append('x')
print(id(lis),id(a))#2538861200904 2538861200904
print('原列表:',lis)#原列表: [1, 2, 3, [1, 2, 3], 'x']
print('拷贝后的列表:',a)#拷贝后的列表: [1, 2, 3, [1, 2, 3], 'x']
2. copy.copy浅拷贝
浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复制
代码验证外围对象确实拷贝了:
import copy
lis=[1,2,3,[1,2,3]]
a=copy.copy(lis)
lis.append('x')
print(id(lis),id(a))#1742178321928 1742178323208
print('原列表:',lis)#原列表: 原列表: [1, 2, 3, [1, 2, 3], 'x']
print('拷贝后的列表:',a)#拷贝后的列表: [1, 2, 3, [1, 2, 3]]
确实是改变原列表复制的列表没有改变 , 但如果改变列表中的列表呢
import copy
lis=[1,2,3,[1,2,3]]
a=copy.copy(lis)
lis[3].append('x')
print(id(lis),id(a))#1833199765000 1833199766280
print('原列表:',lis)#原列表: [1, 2, 3, [1, 2, 3, 'x']]
print('拷贝后的列表:',a)#拷贝后的列表: [1, 2, 3, [1, 2, 3, 'x']]
原列表里面的对象改变 , 拷贝后的也会改变
3. copy.deepcopy深拷贝
完完全全的完整的拷贝了一份 , 源数据怎么变拷贝后的都不会发生改变
import copy
lis=[1,2,3,[1,2,3]]
a=copy.deepcopy(lis)
lis[3].append('x')
print(id(lis),id(a))#1786476135944 1786476137224
print('原列表:',lis)#原列表: [1, 2, 3, [1, 2, 3, 'x']]
print('拷贝后的列表:',a)#拷贝后的列表: [1, 2, 3, [1, 2, 3]]
4. 总结
=: 在Python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。
浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复制
深拷贝:外围和内部元素都进行了拷贝对象本身,而不是引用。也就是,把对象复制一遍,并且该对象中引用的其他对象我也复制。