← 返回 Day 52 正文

Day 52 · 练习与清单

Day 052 — 深拷贝与浅拷贝练习清单

✅ 今日学习清单


📝 基础练习

练习 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. 使用深拷贝管理历史状态


🧠 思考题

  1. 为什么 Python 对不可变对象不进行拷贝? 提示:考虑性能和内存优化。

  2. copy.copy() 和 copy.deepcopy() 对字典有什么区别? 提示:字典的值可能是可变对象。

  3. 深拷贝的 memo 参数如何处理循环引用? 提示:考虑 memo 字典的作用。

  4. 在什么情况下应该避免使用深拷贝? 提示:考虑性能、资源、线程安全。

  5. 如何让一个类同时支持浅拷贝和深拷贝? 提示:需要实现哪些魔术方法?


📚 参考资料