python —— 浅拷贝深拷贝(可变和不可变类型)
2021-02-02 本文已影响0人
mutang
1. 简单可变类型拷贝
- 深拷贝
- 会产生新的空间
- 能够保持各自的独立性
- 如果拷贝的对象,子对象也会拷贝(产生新的空间)
- 浅拷贝
- 不会产生新的空间
- 能够保持各自的独立性
- 如果拷贝的对象,子对象也会拷贝(不会产生新的空间)
2. 复杂可变类型的深浅拷贝
-
深拷贝:
- 拷贝的顶层对象和对象的子对象,子对象也会产生新的内存空间
-
浅拷贝:
- 拷贝的是顶层对象,子对象不会拷贝(只是引用子对象)
a = [11,22] b = [33,44] c = [a,b] c [[11, 22], [33, 44]] d = copy.copy(c) id(c[0]) 2683669746184 id(d[0]) 2683669746184
3.简单不可变类型
都是浅拷贝
x = (1,2,3)
y = copy.copy(x)
e = copy.deepcopy(x)
id(x)
2683669740424
id(y)
2683669740424
id(e)
2683669740424
4. 复杂不可变类型
- 深拷贝:这个数据是否有可变的数据类型,如果有,他就会开辟多个空间存储数据和地址,包装数据的独立性
- 浅拷贝:只关心最外层的数据类型是什么,如果是不可变的类型,直接引用,没有办法保持数据的独立性
r = [11,22]
s = [33,44]
t = (r,s)
t1 = copy.copy(t)
id(t)
2683669749832
id(t1)
2683669749832
r.append(55)
t
([11, 22, 55], [33, 44])
t1
([11, 22, 55], [33, 44])
id(t)
2683669749832
id(t1)
2683669749832
t[0].append(55)
t
([11, 22, 55, 55], [33, 44])
t1
([11, 22, 55, 55], [33, 44])
t2 = copy.deepcopy(d)
t2 = copy.deepcopy(t)
id(t)
2683669749832
id(t2)
2683669755336
t[0].append(88)
t
([11, 22, 55, 55, 88], [33, 44])
t2
([11, 22, 55, 55], [33, 44])
id(t[1])
2683669894600
id(t1[1])
2683669894600
id(t2[1])
2683669753800
5.切片拷贝
-
简单类型
等同于深拷贝,保证数据的独立性
a = [11,22]
b = a[:]
id(a)
2683669808776
id(b)
2683671397000
c = (11,)
d = c[:]
id(c)
2683669818840
id(d)
2683669818840
-
复杂类型
可变:等同于浅拷贝,拷贝的是顶层对象,子对象不会拷贝(只是引用子对象)
不可变:等同于引用
a
[11, 22]
b = [33,44]
c = [a,b]
c
[[11, 22], [33, 44]]
d = c[:]
id(c)
2683669808968
id(d)
2683671368904
id(c[0])
2683669808776
id(d[0])
2683669808776
c[0].append(2)
c
[[11, 22, 2], [33, 44]]
d
[[11, 22, 2], [33, 44]]
a
[11, 22, 2]
b
[33, 44]
c = (a,b)
c
([11, 22, 2], [33, 44])
d = c[:]
id(c)
2683671370760
id(d)
2683671370760
id(c[0])
2683669808776
id(d[0])
2683669808776
c[0].append(1)
c
([11, 22, 2, 1], [33, 44])
d
([11, 22, 2, 1], [33, 44])
6.字典拷贝
浅拷贝
dict1 = {'li': [11,22]}
dict2 = dict1.copy()
id(dict1)
2683661213272
id(dict2)
2683669738192
id(dict1['li'])
2683669843464
id(dict2['li'])
2683669843464
dict1['li'].append(33)
dict2
{'li': [11, 22, 33]}