# 二维数组中的查找
题目描述:简述 python 中深浅拷贝的区别。
# 练习
# 下面改变 b 的第一个元素后,a 的第一个元素也变化了,使用 id 查看两对象是一个 | |
a = [1, 2, 3] | |
b = a | |
b[0] = 4 | |
print(b, id(b)) # [4, 2, 3] 1722827161800 | |
print(a, id(a)) # [4, 2, 3] 1722827161800 | |
# 改变 b 的第一个元素后 a 不影响,id 查看是两个对象 | |
import copy | |
a = [1, 2, 3] | |
b = copy.copy(a) | |
b[0] = 4 | |
print(b, id(b)) # [4, 2, 3] 1722859718536 | |
print(a, id(a)) # [1, 2, 3] 1722859718728 | |
# 和上面 copy 模块的使用一样效果 | |
a = [1, 2, 3] | |
b = a.copy() | |
b[0] = 4 | |
print(b, id(b)) # [4, 2, 3] 1722859718728 | |
print(a, id(a)) # [1, 2, 3] 1722827161800 | |
# 虽然是两个对象,但是发现 a 的第一个元素不受影响,但是 a 的第三个元素,也就是字典里的元素收到了影响,所以这是个浅拷贝 | |
import copy | |
a = [1, 2, {'name': 'Jalen'}] | |
b = copy.copy(a) | |
b[0] = 4 | |
b[2]['name'] = 'Moe' | |
print(b, id(b)) # [4, 2, {'name': 'Moe'}] 1722827161800 | |
print(a, id(a)) # [1, 2, {'name': 'Moe'}] 1722859718536 | |
# 发现 a 对象字典里的元素也不受 b 的影响 | |
import copy | |
a = [1, 2, {'name': 'Jalen'}] | |
b = copy.deepcopy(a) | |
b[0] = 4 | |
b[2]['name'] = 'Moe' | |
print(b, id(b)) # [4, 2, {'name': 'Moe'}] 1722859718536 | |
print(a, id(a)) # [1, 2, {'name': 'Jalen'}] 1722859718728 | |
# 再深入修改数据元素,测试深拷贝,发现 a 完全不受影响 | |
import copy | |
a = [1, 2, {'name': {'china': ['anhui', 'jiangsu', 'zhejiang']}}] | |
b = copy.deepcopy(a) | |
b[0] = 4 | |
b[2]['name']['china'][0] = 'hubei' | |
print(b, id(b)) # [4, 2, {'name': {'china': ['hubei', 'jiangsu', 'zhejiang']}}] 1722859718728 | |
print(a, id(a)) # [1, 2, {'name': {'china': ['anhui', 'jiangsu', 'zhejiang']}}] 1722858518408 |
# 答案
浅拷贝仅拷贝上层元素,如果拷贝后的对象有变化,则深层元素受影响;深拷贝完整复制,修改拷贝过后对象不会对原来对象带来任何影响。