Python——深拷贝和浅拷贝

时间:2023-03-08 23:27:14
Python——深拷贝和浅拷贝

深拷贝、浅拷贝

1. 浅拷贝

浅拷贝是对于一个对象的顶层拷贝

import copy

a = [[1, 2], 3]
b = copy.copy(a)
print(id(a))
print(id(b))
print(id(a[0]))
print(id(b[0]))
print(id(a[1]))
print(id(b[1])) a[0].append(1)
print(a)
print(b)

输出结果:

2249583452872
2250135748552
2249583452808
2249583452808
140714232963984
140714232963984
[[1, 2, 1], 3]
[[1, 2, 1], 3]

copy()是浅拷贝,只拷贝了最顶层的数组,而数组中的内容只是拷贝了引用。

因此用a[0].append(1)方法后,数组a和b都发生了改变。

2. 深拷贝

深拷贝是对于一个对象所有层次的拷贝(递归)

import copy

a = [[1, 2], 3]
b = copy.deepcopy(a)
print(id(a))
print(id(b))
print(id(a[0]))
print(id(b[0])) a[0].append(1)
print(a)
print(b)

输出结果:

1931836547784
1932360400776
1931836547720
1931837818120
[[1, 2, 1], 3]
[[1, 2], 3]

deepcopy()是深拷贝,不仅拷贝最顶层的数组,数组里的内容也拷贝了,这里不同于拷贝引用,而是创建了新的地址空间,存放的内容和原数组相同。因此这次用a[0].append(1)后,b数组没有发生变化。

3.拷贝的其他方式

分片拷贝浅拷贝

import copy

a = [[1, 2], 3]
b = a[:]
print(id(a))
print(id(b))
print(id(a[0]))
print(id(b[0]))
print(id(a[1]))
print(id(b[1])) a[0].append(1)
print(a)
print(b)

输出结果:

2672287769288
2672811617864
2672287769224
2672287769224
140714232963984
140714232963984
[[1, 2, 1], 3]
[[1, 2, 1], 3]

  

可见:分片拷贝是浅拷贝。

字典的copy()方法

d = dict(name='xiaoming', friend=['xiaohong', 'xiaoying'])

c = d.copy()

print(d)
print(c) print(id(d))
print(id(c)) print(id(d['name']))
print(id(c['name'])) print(id(d['friend']))
print(id(c['friend'])) d['friend'].append('lisa') print(d)
print(c)

  

结果:

{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying']}
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying']}
2175018372336
2175021103360
2175021498672
2175021498672
2175017902728
2175017902728
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying', 'lisa']}
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying', 'lisa']}

  

可见,字典的copy()方法也是浅拷贝。

4.注意

copy()和deepcopy()对于不包含可变类型数据的元组,只会拷贝引用

import copy

d = (1, 2, 3)

c = copy.copy(d)
b = copy.deepcopy(d) print(id(d))
print(id(c))
print(id(b))

结果:

1959295969464
1959295969464
1959295969464

当deepcopy()对于包含可变类型数据的元组时,才会拷贝整个元组的内容

import copy

d = (1, 2, [1,2,3])

c = copy.copy(d)
b = copy.deepcopy(d) print(id(d))
print(id(c))
print(id(b))

  

结果:

2774011472056
2774011472056
2774011384024