6.2 copy 与引用
在 Python 中,变量保存的通常不是对象(object)本身,而是指向对象的引用(reference)。理解引用、浅拷贝(shallow copy)和深拷贝(deep copy),是写复杂数据结构时非常重要的一步。
引用
如果写 b = a,并不是复制了一份新数据,而是让 b 指向和 a 相同的对象。
python
info = dict(name="Alice", skills=["Python", "C"])
info_ref = info
info_ref["skills"].append("Java")
print(info)运行结果:
text
{'name': 'Alice', 'skills': ['Python', 'C', 'Java']}因为 info 和 info_ref 指向同一个字典,所以通过其中一个变量修改数据,另一个变量也会看到变化。
正在加载概念检查...
浅拷贝
浅拷贝会复制最外层对象,但不会递归复制内部子对象(nested object / child object)。
python
import copy
info = dict(name="Alice", skills=["Python", "C"])
info_copy = copy.copy(info)
info.pop("name")
info_copy["skills"].append("Java")
print(info)
print(info_copy)运行结果:
text
{'skills': ['Python', 'C', 'Java']}
{'name': 'Alice', 'skills': ['Python', 'C', 'Java']}name 属于外层字典,所以两个字典不同;但 skills 是内部列表(list),浅拷贝后仍然共享。
正在加载交互实验...
深拷贝
深拷贝会递归复制父对象和子对象。
python
import copy
info = dict(name="Alice", skills=["Python", "C"])
info_copy = copy.deepcopy(info)
info.pop("name")
info_copy["skills"].append("Java")
print(info)
print(info_copy)运行结果:
text
{'skills': ['Python', 'C']}
{'name': 'Alice', 'skills': ['Python', 'C', 'Java']}深拷贝后,两个对象内部的 skills 也不再是同一个列表。
正在加载概念检查...
正在加载本节练习...