本文引用自霍格沃兹测试开发学社录播课
经典面试题-Python中的深浅拷贝
霍格沃兹测试开发学社
http://ceshiren.com
问题
面试官可能会问:请介绍一下Python中的深拷贝和浅拷贝
考察点分析
面试官主要的目的是想要了解:
- 深拷贝、浅拷贝的概念和区别
技术点
这个问题涉及到的技术知识为:
- 深拷贝的概念和实现
- 浅拷贝的概念和实现
- 深拷贝、浅拷贝的区别
创建副本
- 浅拷贝 Shallow Copy
- 深拷贝 Deep Copy
Python3 官方文档:https://docs.python.org/3/library/copy.html
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"]]
python3 深拷贝
- 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]]
深浅拷贝的区别
- 浅拷贝构造一个新的复合对象,然后用在原始对象中找到的子对象的引用填充它。
- 深拷贝构造一个新的复合对象,然后递归地用在原始对象中找到的子对象的副本填充它。
总结
请介绍一下Python中的深拷贝和浅拷贝
- 浅拷贝构造一个新的复合对象,然后用在原始对象中找到的子对象的引用填充它。可以使用copy模块的copy()函数实现。
- 深拷贝构造一个新的复合对象,然后递归地用在原始对象中找到的子对象的副本填充它。可以使用copy模块的deepcopy()函数实现。
- 浅拷贝和深拷贝之间的区别仅与复合对象有关,浅拷贝只是一个层次的拷贝,不会递归;而深拷贝的拷贝过程是递归的,可以拷贝出完全独立的副本。: