Python中的深浅拷贝

本文引用自霍格沃兹测试开发学社录播课

经典面试题-Python中的深浅拷贝

霍格沃兹测试开发学社
http://ceshiren.com

问题

面试官可能会问:请介绍一下Python中的深拷贝和浅拷贝

考察点分析

面试官主要的目的是想要了解:

  • 深拷贝、浅拷贝的概念和区别

技术点

这个问题涉及到的技术知识为:

  • 深拷贝的概念和实现
  • 浅拷贝的概念和实现
  • 深拷贝、浅拷贝的区别

创建副本

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()函数实现。
  • 浅拷贝和深拷贝之间的区别仅与复合对象有关,浅拷贝只是一个层次的拷贝,不会递归;而深拷贝的拷贝过程是递归的,可以拷贝出完全独立的副本。: