Python中浅拷贝与深拷贝的区别及实现

Evan
Evan
发布时间:2026-10-16 | 4人浏览过
原创

本文详细解析Python中的变量赋值、浅拷贝与深拷贝机制。通过对比说明赋值操作共享内存地址,浅拷贝仅复制顶层对象而共享子对象引用,深拷贝则递归创建完全独立的副本。结合具体代码示例,展示如何使用copy模块实现不同层级的拷贝,帮助开发者理解内存分配与对象依赖关系。

1.变量的赋值操作

在Python中,简单的变量赋值(如 a = b)并不会创建新对象,而是让新变量指向原对象的内存地址。这意味着多个变量名实际上指向同一个对象实例。

# -*- coding: utf-8 -*-
class CPU:
    pass
class Disk:
    pass
class Computer:
    def __init__(self, cpu, disk):  # 给对象的实例属性进行初始化
        self.cpu = cpu
        self.disk = disk
# 变量的赋值
cp1 = Computer(cpu='CPU', disk='DISK')  # 创建CPU类的实例对象
cp2 = cp1  
# 变量的赋值,一个对象的实例采用两个变量存储,实际上还是指向一个对象
print(cp1, id(cp1))
print(cp2, id(cp2))

赋值操作(=)本质上是创建了一个新的引用指向原有对象。因此,如果通过任一变量修改了可变对象的内容,所有指向该对象的变量都会反映出这一变化。

2.浅拷贝

Python中的默认拷贝行为通常为浅拷贝。执行浅拷贝时,系统会创建一个新的容器对象,但不会递归地拷贝其内部包含的子对象。因此,源对象与拷贝后的对象会共享相同的子对象引用。

# -*- coding: utf-8 -*-
import copy
class CPU:
    pass
class Disk:
    pass
class Computer:
    def __init__(self, cpu, disk):  # 给对象的实例属性进行初始化
        self.cpu = cpu
        self.disk = disk
cpu = CPU()  # 创建一个 CPU 类的实例对象
disk = Disk()  # 创建一个Disk 类对象
computer = Computer(cpu, disk)  # 创建一个Computer类的实例对象
# 浅拷贝
print(cpu)
print(disk)
computer2 = copy.copy(computer)  # 子对象不拷贝
print(computer, computer.cpu, computer.disk)
print(computer2, computer2.cpu, computer2.disk)
# 类的浅拷贝:
# Python的拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝
# 因此,源对象与拷贝对象会引用同一个子对象

浅拷贝的定义是:创建一个新的外层对象,但该对象内部包含的引用仍指向原始对象中的子对象。

由于子对象被共享,如果通过引用方式修改其中一个对象的子对象内容,另一个对象中的对应子对象也会随之改变。

常见的浅拷贝方式包括:

{1. 完全切片方法,例如 list[:];2. 工厂函数,如 list()、dict() 等;3. copy 模块提供的 copy() 函数}

3.深拷贝

使用 copy 模块的 deepcopy 函数可以实现深拷贝。该函数会递归地拷贝对象中包含的所有子对象,确保源对象和拷贝后的对象在子对象层面也不相同,互不影响。

# -*- coding: utf-8 -*-
import copy
class CPU:
    pass
class Disk:
    pass
class Computer:
    def __init__(self, cpu, disk):  # 给对象的实例属性进行初始化
        self.cpu = cpu
        self.disk = disk
cpu = CPU()  # 创建一个 CPU 对象
disk = Disk()  # 创建一个硬盘类对象
computer = Computer(cpu, disk)  # 创建一个计算机类对象
# 深拷贝
computer1 = copy.deepcopy(computer)
print(computer, computer.cpu, computer.disk)
print(computer1, computer1.cpu, computer1.disk)
# 类的深拷贝
# 使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象
# 源对象和拷贝对象所有的子对象也不同

深拷贝的定义是:创建一个新的外层对象,并递归地复制它所包含的所有子对象,生成一个完全独立的副本。

在深拷贝下,修改其中一个对象(包括其子对象),另一个对象不会发生任何改变。因此,新对象和原对象在内存中完全独立,没有任何关联。

例如:{使用 copy 模块的 deepcopy() 函数}

4.总结

最直观的理解就是:

1. 浅拷贝:拷贝程度较浅,仅拷贝原数据的首地址(外层容器),然后通过该首地址获取内部子对象的引用。

2. 深拷贝:拷贝程度较深,系统会新开辟一块内存空间,将被拷贝的内容(包括所有层级的子对象)全部复制过来。

到此这篇关于Python详细讲解浅拷贝与深拷贝的使用的文章就介绍到这了,更多相关Python浅拷贝与深拷贝内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表