Day 052 — 深拷贝与浅拷贝练习清单
✅ 今日学习清单
- [ ] 理解赋值、浅拷贝、深拷贝的区别
- [ ] 掌握
copy.copy()的使用 - [ ] 掌握
copy.deepcopy()的使用 - [ ] 理解可变对象与不可变对象的拷贝行为差异
- [ ] 掌握
__copy__和__deepcopy__魔术方法 - [ ] 理解
memo参数的作用 - [ ] 完成代码示例的运行和理解
📝 基础练习
练习 1:浅拷贝陷阱
创建一个嵌套列表 data = [[1, 2], [3, 4]],使用浅拷贝创建副本,然后修改副本的嵌套元素,验证原列表是否被修改。
python
# 预期输出:
# 修改后原始列表: [[1, 2], [3, 4, 5]]
# 嵌套对象被共享了!
练习 2:深拷贝验证
创建一个包含循环引用的对象,使用深拷贝创建副本,验证: 1. 副本与原对象是独立的 2. 循环引用关系被正确复制 3. 修改副本不影响原对象
练习 3:不可变对象拷贝
测试以下对象的拷贝行为:
- 整数 42
- 字符串 "hello"
- 元组 (1, 2, [3, 4])
- 元组 (1, 2, 3)
解释为什么有些返回原对象,有些返回新对象。
🔥 进阶挑战
挑战 1:自定义拷贝类
创建一个 Matrix 类,实现自定义的浅拷贝和深拷贝:
1. 浅拷贝:共享数据,但创建新的元信息
2. 深拷贝:完全独立副本
3. 测试两种拷贝的行为差异
挑战 2:快照系统
实现一个支持以下功能的快照系统:
1. save() - 保存当前状态
2. restore(index) - 恢复到指定快照
3. diff(index1, index2) - 比较两个快照的差异
4. list() - 列出所有快照
挑战 3:撤销/重做系统
实现一个支持撤销/重做操作的编辑器: 1. 支持添加、删除、修改操作 2. 支持无限次撤销 3. 支持重做已撤销的操作 4. 使用深拷贝管理历史状态
🧠 思考题
-
为什么 Python 对不可变对象不进行拷贝? 提示:考虑性能和内存优化。
-
copy.copy()和copy.deepcopy()对字典有什么区别? 提示:字典的值可能是可变对象。 -
深拷贝的
memo参数如何处理循环引用? 提示:考虑memo字典的作用。 -
在什么情况下应该避免使用深拷贝? 提示:考虑性能、资源、线程安全。
-
如何让一个类同时支持浅拷贝和深拷贝? 提示:需要实现哪些魔术方法?