浅拷贝:新开辟一块内存,只拷贝原数据的首地址,通过原数据的首地址去获取内容。(类似于建立快捷方式)
深拷贝:新开辟一块内存,将被拷贝内容全部拷贝过来(直接独立复制)
理解:重新分配一块内存,建立新的对象,里面的元素是原对象元素的引用
list1==list2?True(元素的值一样)
list1 is list2? False(内存不一样)
- #列表list
- list1=[1,2,3]
- list2=list(list1)
-
- #set
- set1=([1,2,3])
- set2=set(set1)
-
- #字典dict
- dict1={1:[1,'w'],2:33}
- dict2=dict(dict1)
- list1=[1,2,3]
- list2=list1[:]
注:
① 对于不可变数据类型(元组、字符串):
列表的切片是浅拷贝(创建新的内存空间),元组的切片是赋值(不会创建新的内存空间)
② 切片操作符不能用于字典和集合完成浅拷贝
!!copy.copy()要先导入copy模块
- list1=[1,2,3]
- list2=list1.copy()
- import copy#需要先导入copy模块
-
- list1=[1,2,3]
- list2=copy.copy(list1)
子变 父不变
- list1=[(1,2),3,[4,5]]
- list2=list1.copy()
- list1.append(31)
- print(list1)#[(1, 2), 3, [4, 5], 31]
- print(list2)#[(1, 2), 3, [4, 5]]
-
- list1=[(1,2),3,[4,5]]
- list2=list1.copy()
- list2.append(31)
- print(list1)#[(1, 2), 3, [4, 5]]
- print(list2)#[(1, 2), 3, [4, 5], 31]
-
- list1=[(1,2),3,[4,5]]
- list2=list1.copy()
- list1[0]+=(31,31)
- print(list1)#[(1, 2,31,31), 3, [4, 5]]
- print(list2)#[(1, 2), 3, [4, 5]]
-
- list1=[(1,2),3,[4,5]]
- list2=list1.copy()
- list1[2]+=[31,31]
- print(list1)#[(1, 2), 3, [4, 5,31,31]]
- print(list2)#[(1, 2), 3, [4, 5,31,31]]
深拷贝后是两份独立的数据,改变任一数据不影响另一个
- import copy
-
- list1=[[1,2],(1,2),1]
- list2=copy.deepcopy(list1)
- print(list2)#[[1, 2], (1, 2), 1]
- list1.append('hhh')
- print(list1)#[[1, 2], (1, 2), 1, 'hhh']
- print(list2)#[[1, 2], (1, 2), 1]
-
- list1=[[1,2],(1,2),1]
- list2=copy.deepcopy(list1)
- list1[0].append('hhh')
- print(list1)#[[1, 2, 'hhh'], (1, 2), 1]
- print(list2)#[[1, 2], (1, 2), 1]
-
- list1=[[1,2],(1,2),1]
- list2=copy.deepcopy(list1)
- list1[1] += (111,222)
- print(list1)#[[1, 2], (1, 2,111,222), 1]
- print(list2)#[[1, 2], (1, 2), 1]