#列表
lst1 = ['A', 'B', 'C']
lst2 = lst1
lst1.append('D')
print(lst1, lst2)
#字典
dic1 = {'A': '1', 'B': '2'}
dic2 = dic1
dic1['C'] = '3'
print(dic1, dic2)
#set集合
s1 = {'A', 'B', 'C'}
s2 = s1
s1.add('D')
print(s1, s2)
'''
结果:
['A', 'B', 'C', 'D'] ['A', 'B', 'C', 'D']
{'A': '1', 'C': '3', 'B': '2'} {'A': '1', 'C': '3', 'B': '2'}
{'A', 'C', 'B', 'D'} {'A', 'C', 'B', 'D'}
'''
对于list、set、dict来说,直接赋值就是把内存地址交给变量,并不是复制一份内容,所以lst1的内存指向和lst2一样的,不管lst1还是lst2新增或者删除元素,都会进行改变
- 浅拷贝copy 1:
import copy
lst1 = ['A', 'B', 'C']
lst2 = lst1.copy()
lst1.append('D')
print(lst1, lst2)
print(id(lst1), id(lst2))
结果:
['A', 'B', 'C', 'D'] ['A', 'B', 'C']
35980808 35559880
- 浅拷贝copy 2:只拷贝第一层,第二层的内容不会被拷贝,所以称为浅拷贝
import copy
lst1 = ['A', 'B', 'C', ['D', 'E']]
lst2 = lst1.copy()
lst1[3].append('F')
print(lst1, lst2)
print(id(lst1[3]),id(lst2[3]))
结果:
['A', 'B', 'C', ['D', 'E', 'F']] ['A', 'B', 'C', ['D', 'E', 'F']]
35587592 35587592
我们发现,浅拷贝copy 1使用copy()方法,两个list的内容和内存地址都不一样了,实现了内存的拷贝,但浅拷贝copy 2也使用的是copy()方法,但只拷贝了第一层,第二层 lst2的内存地址还是和lst1在同一块,那怎么解决这块问题了,我们看下深拷贝
- 深拷贝 deepcopy()
import copy
lst1 = ['A', 'B', 'C', ['D', 'E']]
lst2 = copy.deepcopy(lst1) #copy.deepcopy(变量)
lst1[3].append('F')
print(lst1, lst2)
print(id(lst1[3]),id(lst2[3]))
结果:
['A', 'B', 'C', ['D', 'E', 'F']] ['A', 'B', 'C', ['D', 'E']]
35928840 35926216
现在看,内层的内存地址都不一样了,深度拷贝就是把元素内部的元素完全进行拷贝复制,这样就不会出现浅拷贝那种情况
copy.deepcopy(变量),不管有多少层都会完全进行拷贝复制。