You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:45:29