软件测试学习笔记
面试官问: 请介绍一下Python中的深拷贝和浅拷贝
考察点
- 深拷贝、浅拷贝的概念和区别
技术点
- 深拷贝的概念和实现
- 浅拷贝的概念和实现
- 深拷贝、浅拷贝的区别
创建副本
- 浅拷贝 Shallow Copy
- 深拷贝 Deep Copy
Python3 官方文档:docs.python.org/3/library/c…
Python3浅拷贝
- copy.copy()
# shallow_copy.py
import copy
old = [[1, 2], [3, 4]]
# 浅拷贝,得到副本
new = copy.copy(old)
print("Old list:", old) # Old : [[1, 2], [3, 4]]
print("New list:", new) # New : [[1, 2], [3, 4]]
# 给原始对象添加新元素
old.append([5, 6])
print("Old :", old) # Old : [[1, 2], [3, 4], [5, 6]]
print("New :", new) # New : [[1, 2], [3, 4]]
# 修改原始对象
old[1][1] = "hogwarts"
print("Old :", old) # Old : [[1, 2], [3, "hogwarts"], [5, 6]]
print("New :", new) # New : [[1, 2], [3, "hogwarts"]]
Python深拷贝
- copy.deepcopy()
# deep_copy.py
import copy
old = [[1, 2], [3, 4]]
# 浅拷贝,得到副本
new = copy.deepcopy(old)
print("Old list:", old) # Old : [[1, 2], [3, 4]]
print("New list:", new) # New : [[1, 2], [3, 4]]
# 修改原始对象
old[1][1] = "hogwarts"
print("Old :", old) # Old : [[1, 2], [3, "hogwarts"]]
print("New :", new) # New : [[1, 2], [3, 4]]
深浅拷贝的区别
- 浅拷贝构造一个新的复合对象,然后用在原始对象中找到的子对象的引用填充它。
- 深拷贝构造一个新的复合对象,然后递归地用在原始对象中找到的子对象的副本填充它。
总结
- 浅拷贝构造一个新的复合对象,然后用在原始对象中找到的子对象的引用填充它。可以使用copy模块的copy()函数实现。
- 深拷贝构造一个新的复合对象,然后递归地用在原始对象中找到的子对象的副本填充它。可以使用copy模块的deepcopy()函数实现。
- 浅拷贝和深拷贝之间的区别仅与复合对象有关,浅拷贝只是一个层次的拷贝,不会递归;而深拷贝的拷贝过程是递归的,可以拷贝出完全独立的副本。