Python中深拷贝与浅拷贝的区别介绍

一颗松果
一颗松果
发布时间:2026-10-15| 6人浏览过
原创

本文详细解析Python中深拷贝与浅拷贝的核心区别。通过对比可变与不可变类型在复制过程中的内存地址变化,结合具体代码示例,说明浅拷贝仅复制顶层对象而深拷贝递归复制子对象的行为差异,帮助开发者避免数据引用错误。

Python包含6种标准数据类型,依据是否可修改可分为两类:不可变类型包括Number(数字)、String(字符串)和Tuple(元组);可变类型包括List(列表)、Dictionary(字典)和Set(集合)。

浅拷贝

执行浅拷贝时,若修改原始对象中可变类型元素的值,拷贝对象也会随之改变;但若修改的是不可变类型元素的值,则不会影响拷贝对象。

代码演示

import copy
#定义一个列表,其中第一个元素是可变类型。
list1 = [[1,2], 'fei', 66];
#进行浅copy
list2 = copy.copy(list1);
 
#对象地址是否相同。
print(id(list1));
print(id(list2));
#结果:不同
46177816
46177936
 
#第一个元素地址是否相同。
print(id(list1[0]));
print(id(list2[0]));
#结果:相同
46240432
46240432
 
#第二个元素地址是否相同。
print(id(list1[1]));
print(id(list2[1]));
#结果:相同
45547328
45547328
 
#改变第一个值,查看复制对象变化。
list1[0][0] = 2;
print(list2);
#结果:复制对象发生变化
[[2, 2], 'fei', 66]
 
#改变第二个值,查看复制对象变化。
list1[1] = 'ge';
print(list2);
#结果:复制对象没发生变了
[[2, 2], 'fei', 66]

深拷贝

深拷贝不仅复制顶层对象,还会递归复制所有子元素。经过深拷贝后,原始对象与拷贝对象中所有可变元素的内存地址均不相同。

代码演示

import copy
#定义一个列表,其中第一个元素是可变类型。
list1 = [[1,2], 'fei', 66];
#进行深copy
list2 = copy.deepcopy(list1);
 
#对象地址是否相同。
print(id(list1));
print(id(list2));
#结果:不同
46177816
46177936
 
#第一个元素地址是否相同。
print(id(list1[0]));
print(id(list2[0]));
#结果:不同
49123856
49588784
 
#第二个元素地址是否相同。
print(id(list1[1]));
print(id(list2[1]));
#结果:相同
45547328
45547328
 
#改变第一个值,查看复制对象变化。
list1[0][0] = 2;
print(list2);
#结果:复制对象没发生变了
[[1, 2], 'fei', 66]
 
#改变第二个值,查看复制对象变化。
list1[1] = 'ge';
print(list2);
#结果:复制对象没发生变了
[[1, 2], 'fei', 66]

至此,关于Python中深拷贝与浅拷贝的区别已介绍完毕。希望本文内容能对您的学习有所帮助,欢迎继续支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。