Python中能否自主选择深拷贝与浅拷贝?代码示例疑问
Python中如何自主选择浅拷贝或深拷贝?
Python里确实没有C++那样的指针,但变量的本质是对象的引用——直接赋值(比如你的代码里self.link_c = c)就相当于复制了这个引用,两个变量指向同一个对象,这就是你看到的“浅拷贝”效果,修改其中一个的属性会直接影响原对象。
当然可以自主决定用浅拷贝还是深拷贝,核心是借助copy模块的工具,或者自定义拷贝逻辑:
1. 浅拷贝(默认行为)
直接赋值就是最基础的浅拷贝,也可以用copy.copy()实现,它会创建一个新对象,但新对象里的可变属性依然指向原对象的引用:
import copy # 用copy.copy()实现浅拷贝 c0 = Child() c1 = Child() c1.link_c = copy.copy(c0)
这种情况下修改c1.link_c.v0,c0.v0也会跟着变,和你原来的代码效果一致。
2. 深拷贝(生成完全独立的新对象)
如果要生成一个和原对象完全独立的副本,修改副本不影响原对象,就用copy.deepcopy(),它会递归复制对象里所有嵌套的可变元素:
import copy class Child: def __init__(self, c=None, deep_copy=False): self.v0 = 0 self.v1 = 1 if c is not None: # 根据参数选择浅/深拷贝 if deep_copy: self.link_c = copy.deepcopy(c) else: self.link_c = c # 浅拷贝 def exe(self, input): self.link_c.v0 = input class Parent: def __init__(self, use_deep_copy=False): self.a = 0 self.c0 = Child() # 传入参数决定拷贝方式 self.c1 = Child(c=self.c0, deep_copy=use_deep_copy) def exe(self, input): self.c1.exe(input) # 测试浅拷贝 p0 = Parent() p0.exe(3) print(p0.c0.v0) # 输出3,和原代码一致 # 测试深拷贝 p1 = Parent(use_deep_copy=True) p1.exe(5) print(p1.c0.v0) # 输出0,深拷贝的副本修改不影响原对象
关键区别
- 浅拷贝:只复制对象本身,对象内部的可变属性(比如自定义实例、列表)还是共享引用,适合不需要完全隔离原对象的场景,效率更高。
- 深拷贝:递归复制所有嵌套的可变元素,生成完全独立的新对象,适合需要彻底隔离原对象的场景,但因为要递归复制,效率稍低。
内容的提问来源于stack exchange,提问作者VIArchitect
相关产品推荐
相关产品推荐

