Python 深拷贝和浅拷贝有什么区别?
这道题表面上问区别,实际在考你对 Python 对象模型、引用机制 的理解。直接上干货。
🆚 三句话定本质¶
🧪 代码不会骗人¶
import copy
old = [[1, 2], [3, 4]]
shallow = copy.copy(old)
deep = copy.deepcopy(old)
# 修改原对象的内层元素
old[0][0] = 'X'
print("浅拷贝:", shallow) # [['X', 2], [3, 4]] 😱 被牵连了!
print("深拷贝:", deep) # [[1, 2], [3, 4]] 😎 不动如山
背后的真相:
-
shallow复制了外层列表,但里面的小列表[1,2]还是同一个对象。 -
deep连小列表都复制了一份全新的,自此老死不相往来。
🧠 进阶加分项(亮出来我会加分)¶
-
全是不可变对象 → 浅拷贝表现“像”深拷贝,因为修改会创建新对象,但引用逻辑没变。
-
循环引用 →
deepcopy内部用memo字典防无限递归,能手写一个简单版说明你懂了精髓。 -
魔术方法 →
copy/deepcopy可以定制类的拷贝行为。
一句话总结:浅拷贝共享内侧,深拷贝全家独立。搞清引用,才算真正入门 Python 对象机制。 💪