浅析深拷贝与浅拷贝

01 深拷贝与浅拷贝

1. 定义解释

简单理解, 深拷贝和浅拷贝就是拷贝内容的层次深度不一样。深拷贝所有都是新的(递归),浅拷贝只有第一层是新的。python

指向

a = [11, 22] 指在内存中开辟一个空间,存储[11, 22]这个列表,a 指向这个空间的内存地址。
b = a , 表示b 也指向这个内存地址,没有开辟新的内存空间。
id(a) = id(b)app

另外: a == b (True) 内容相同, a is b (True) 内存地址相同
code

浅拷贝

浅拷贝只是单纯地拷贝要拷贝的东西的指向,可是不拷贝指向的内存地址中的内容。(拷贝C的快捷方式)
对象

import copy
a = [11, 22]
b = [33, 44]
c = [a, b]
e = copy.copy(c)
id(e) = id(c)

id(e)
Out[41]: 2447913914184
id(c)
Out[42]: 2447914220744
id(e[0])
Out[43]: 2447913762952
id(c[0])
Out[44]: 2447913762952

# 在c中新增一个数值,e不会改变
c.append(55)
c
Out[47]: [[11, 22], [33, 44], 55]
e
Out[48]: [[11, 22], [33, 44]]

# 可是在a中新增一个数值,则e也会改变
a.append(66)
c
Out[50]: [[11, 22, 66], [33, 44], 55]
e
Out[51]: [[11, 22, 66], [33, 44]]

代表, 当e = copy.copy(c) 浅copy 时, 只copy了c 的指向,并无生成新的a, bblog

深拷贝

f = copy.deepcopy(c) ,生成了存储内容跟a, b 同样的新的内容空间递归

f = copy.deepcopy(c)
id(f[0]) == id(c[0])
Out[60]: False

2. 特殊状况

当拷贝的对象是元组类型时

a = (11, 22)
b = (33, 44)
a = (11, 22)
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
id(b)
Out[67]: 2447914673928
id(c)
Out[68]: 2447914673928
id(d)
Out[69]: 2447914673928

若是copy.copy拷贝的是元组,那么它不会进行浅拷贝,仅仅是指向。
缘由: 由于元组是不可变类型,那么意味着数据必定不能修改,所以copy.copy的时候会自动判断,是元组就指向内存

a = [11, 22]
b = [33, 44]
c = (a, b)
d = copy.copy(c)
e = copy.deepcopy(c)
id(c)
Out[75]: 2447914777800
id(d)
Out[76]: 2447914777800
id(e)
Out[77]: 2447914770824

若是用copy.copy 或者copy.deepcopy对一个所有都是不可变类型的数据进行拷贝,那么他们的结果相同,都是引用指向。
若是拷贝的是一个不可变类型的数据,即便元组是最顶层,那么deepcopy依然是深拷贝,而copy.copy仍是指向。class

相关文章
相关标签/搜索