Python中对象赋值、浅拷贝与深拷贝的区别详解

江屿
江屿
发布时间:2026-10-13| 6人浏览过
原创

本文深入解析Python中对象赋值的三种方式:赋值、浅拷贝与深拷贝。通过对比内存引用、修改行为及嵌套列表的影响,阐明切片、工厂函数与copy模块的具体用法,帮助开发者避免常见的引用陷阱,掌握正确的数据复制策略。

在Python中,处理对象复制主要涉及三种机制:直接赋值、浅拷贝以及深拷贝。这三者之间既存在联系又有显著差异。针对近期遇到的相关场景,本文将对这些概念进行详细梳理与分析。

一、直接赋值

在Python语言中,对象的赋值操作本质上仅是建立对象的引用关系,这一机制与C++的处理方式有所不同。具体示例如下:

a = [1,2,3,"hello",["python","C++"]] 
b = a 
print a==b #True 

在此场景下,变量b与变量a指向完全相同的内存地址,b仅被视为a的一个别名或引用标识。我们可以通过检查a与b是否相等来验证这一点,若返回True,则证实两者拥有相同的内存地址及内容。

赋值操作(涵盖将对象作为参数传递或作为返回值返回的情况)并不会分配新的内存空间,其核心作用仅在于复制了目标对象的引用。换言之,除了新增变量名b之外,系统不会带来额外的内存开销。

若对变量a进行修改,变量b的内容将随之改变;反之,若修改变量b,变量a也会受到影响。

a = [1,2,3,"hello",["python","C++"]] 
b = a 
b.append("ADD") 
print "a=",a,"b=",b 
#a=[1, 2, 3, 'hello', ['python', 'C++'], 'ADD'] b=[1, 2, 3, 'hello', ['python', 'C++'], 'ADD'] 

二、浅拷贝(shallow copy)

浅拷贝会创建一个新的对象实例,但其内部存储的内容仍为原对象中元素的引用。

实现浅拷贝主要有三种途径:切片操作、工厂函数调用以及使用copy模块中的copy函数。

以列表a为例,具体操作方式如下:

1、切片操作:可通过 b = a[:] 或列表推导式 b = [each for each in a] 实现。

2、工厂函数:利用 b = list(a) 进行创建。

3、copy函数:使用 b = copy.copy(a) 完成拷贝。

经过浅拷贝生成的变量b已不再与a指向同一对象。通过is运算符判断可知二者不同,使用id函数查看内存地址也证实它们指向不同的内存区域。然而,若遍历a和b中的元素并获取其id(即 id(x) for x in a 和 id(x) for x in b),会发现两者所包含元素的内存地址是相同的。

在此情况下,a和b被视为不同的对象,理论上对b的修改不应影响a。例如执行 b.append([4,5]) 时,a保持不变。

a = [1,2,3,"hello",["python","C++"]] 
b = a[:] 
b.append("ADD") 
print "a",a,"b",b 
#a [1, 2, 3, 'hello', ['python', 'C++']] b [1, 2, 3, 'hello', ['python', 'C++'], 'ADD']

但需特别注意,浅拷贝之所以被称为“浅”,是因为它仅处理了一层引用。若列表a中包含嵌套的list,修改该嵌套结构时情况将发生变化。

例如执行 a[4].append("C") 后,观察变量b会发现其内容也发生了改变。原因在于,虽然修改外层元素会改变引用指向,但修改嵌套列表中的元素时,嵌套列表本身的内存地址并未改变,a和b中的嵌套列表仍指向同一位置。

三、深拷贝(deep copy)

深拷贝仅有一种实现形式,即使用copy模块中的deepcopy函数。

与浅拷贝相对,深拷贝会递归地拷贝对象的所有元素,包括多层嵌套的结构。因此,这种操作在时间和空间上的开销相对较高。

同样针对列表a,若使用 b = copy.deepcopy(a) 进行深拷贝,随后对b的任何修改都不会影响a。即使嵌套列表具有更深的层级,也不会产生任何副作用,因为深拷贝生成的对象是一个完全独立的全新对象,与原对象不再存在任何关联。

四、关于拷贝操作的注意事项

1、对于非容器类型,如数字、字符及其他“原子”类型,不存在拷贝的概念。对这些类型的操作产生的结果均为原对象的引用。

2、如果元组变量值中包含原子类型对象,即使采用深拷贝,最终得到的仍是浅拷贝效果。

以上关于Python List赋值与拷贝方法的解析即为全部内容,希望能为读者提供有价值的参考,并欢迎大家继续支持本站获取更多技术资讯。

相关标签:

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

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 算法库。