深拷贝和浅拷贝
import copy
浅拷贝
copy
函数是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象的子对象。
不可变类型的浅拷贝说明:
- 不可变类型进行浅拷贝不会给拷贝的对象开辟新的内存空间,而只是拷贝了这个对象的引用。
import copy
a1 = 123123
b1 = copy.copy(a1)
print(id(a1))
print(id(b1))
a2 = "abc"
b2 = copy.copy(a2)
print(id(a2))
print(id(b2))
a3 = (1, 2, ["hello", "world"])
b3 = copy.copy(a3)
print(id(a3))
print(id(b3))
a3[2][1] = "hello"
print(a3[2])
print(b3[2])
可变类型的浅拷贝说明:
- 可变类型进行浅拷贝只对可变类型的第一层对象进行拷贝,对拷贝的对象会开辟新的空间进行存储,子对象不进行拷贝。
import copy
a1 = [1, 2]
b1 = copy.copy(a1)
print(id(a1))
print(id(b1))
a2 = {"name": "张三", "age": 20}
b2 = copy.copy(a2)
print(id(a2))
print(id(b2))
a3 = {1, 2, "王五"}
b3 = copy.copy(a3)
print(id(a3))
print(id(b3))
a4 = [1, 2, [4, 5]]
b4 = copy.copy(a4)
print(id(a4))
print(id(b4))
print(id(a4[2]))
print(id(b4[2]))
a4[2][0] = 6
print(a4) // [1, 2, [6, 5]]
print(b4) // [1, 2, [6, 5]]
- 注意:
集合对象.copy()
方法和列表的切片[:]
都是浅拷贝。
深拷贝
deepcopy
函数是深拷贝,只要发现对象有可变类型就会对该对象到最后一个可变类型的每一层对象进行拷贝,对每一层拷贝的对象都会开辟新的内存空间进行存储。
不可变类型的深拷贝说明:
- 不可变类型进行深拷贝如果子对象没有可变类型则不会进行拷贝,而只是拷贝了这个对象的引用。遇到不可变类型里套可变类型,子对象按可变类型进行深拷贝。
import copy
a1 = 1
b1 = copy.deepcopy(a1)
print(id(a1))
print(id(b1))
a2 = "张三"
b2 = copy.deepcopy(a2)
print(id(a2))
print(id(b2))
a3 = (1, 2)
b3 = copy.deepcopy(a3)
print(id(a3))
print(id(b3))
a4 = (1, ["李四"])
b4 = copy.deepcopy(a4)
print(id(a4))
print(id(b4))
print(id(a4[1]))
print(id(b4[1]))
可变类型的拷贝说明:
- 可变类型进行深拷贝会对该对象到最后一个可变类型的每一层对象进行拷贝,对每一层拷贝的对象都会开辟新的内存空间进行存储。
import copy
a1 = [1, 2]
b1 = copy.deepcopy(a1)
print(id(a1))
print(id(b1))
a2 = {"name": "张三"}
b2 = copy.deepcopy(a2)
print(id(a2))
print(id(b2))
a3 = {1, 2}
b3 = copy.deepcopy(a3)
print(id(a3))
print(id(b3))
a4 = [1, 2, ["李四", "王五"]]
b4 = copy.deepcopy(a4)
print(id(a4))
print(id(b4))
print(id(a4[2]))
print(id(b4[2]))
a4[2][0] = "王五"
print(a4) // [1, 2, ['王五', '王五']]
print(b4) // [1, 2, ['李四', '王五']]
深拷贝和浅拷贝的区别
- 浅拷贝最多拷贝对象的一层
- 深拷贝可以拷贝对象的多层