Python赋值与拷贝机制详解:从变量引用到深浅拷贝

月亮慢半拍
月亮慢半拍
发布时间:2026-10-13| 3人浏览过
原创

本文深入解析Python中的变量赋值与对象拷贝机制。通过对比is与==运算符,阐明变量仅是对对象的引用而非拷贝。重点讲解copy模块提供的浅拷贝与深拷贝差异:不可变对象拷贝结果一致,而组合对象中浅拷贝仅复制外层容器,深拷贝则递归复制内部元素。结合代码示例说明修改原对象对拷贝结果的影响,帮助开发者避免副作用。

变量与赋值

在Python语言中,所有数据均为对象,而变量名实际上是对这些对象的引用标识。更准确地说,变量名应被视为“名字”,正如每个人拥有独特的姓名一样,代码通过变量名来指向特定的对象实例。

变量赋值操作本质上是给现有对象绑定一个名称,这一过程并不会创建对象的副本。这类似于父母为孩子取名或赋予绰号,增加名字并不会凭空创造出新的个体,只是增加了指向同一对象的引用路径。

在Python中比较两个对象存在两种方式:使用is运算符和==运算符。is用于判断两个变量是否指向内存中的同一个对象,可通过对象的ID值进行验证;而==则用于判断两个对象所包含的值是否相等。

>>> x1 = [1,2]
>>> x2 = [1,2]
>>> x1 is x2
False
>>> id(x1)
4338854088
>>> id(x2)
4338904392
>>> x1 == x2
True

尽管x1和x2包含相同的值,但它们在内存中是两个独立且不同的对象,占据着各自的内存空间。这类似于桌面上摆放的两个外观相同的苹果,尽管看起来一样,但它们是两个独立的物理实体。

>>> x3 = x2
>>> x3 is x2
True
>>> id(x3)
4338904392

前文提到赋值即为对象绑定名字,此处我们将x2所指向的对象额外绑定了一个新名字x3。这好比桌上有一个苹果,先贴上x2标签,再贴上x3标签,本质上仍是同一个苹果。因此,x2和x3指向的是完全相同的对象实例。

当通过x2修改该对象时,x3所指向的内容也会随之改变,因为二者引用的是同一个对象。这类似于张三和小张是同一个人,给张三添置衣物等同于给小张添置衣物。

>>> x2.append(3)
>>> x2
[1, 2, 3]
>>> x3
[1, 2, 3]

然而,当对x2进行重新赋值时,x2将不再引用之前的对象,而是指向一个新的对象,此时x3仍然引用原来的对象。这好比桌上有一个贴有x2和x3标签的苹果,将x2标签撕下贴到另一个苹果上,x3标签仍留在原苹果上。

>>> x2 = [3, 4]
>>> x3
[1, 2, 3]

对象拷贝

在实际业务开发中,有时需要复制一个对象,同时避免对原对象产生副作用。由于赋值操作仅绑定名称而非创建副本,无法通过简单赋值实现此需求。因此,Python提供了专门的拷贝机制,基于原对象快速创建一个具有相同值的新对象,该功能由copy模块提供。

拷贝操作主要分为浅拷贝(Shallow Copy)和深拷贝(Deep Copy)两种类型。

>>> s = [1,2,3]>>> sc = copy.copy(s) # 浅拷贝>>> sc[1, 2, 3]
>>> sdc = copy.deepcopy(s) # 深拷贝
>>> sdc
[1, 2, 3]

通过拷贝生成的新对象虽然值与原对象相同,但它们是两个独立的对象实例。

>>> s == sc == sdc 
True
>>> s is sc 
False
>>> s is sdc
False

那么,浅拷贝与深拷贝之间的具体区别究竟在哪里?

对于不可变对象,例如整数、字符串、元组,以及由这些不可变对象构成的集合对象,浅拷贝和深拷贝的效果没有区别,两者都会创建一个新的对象。

两者的关键区别体现在对组合对象(如嵌套列表、包含字典或列表的字典)的处理上。浅拷贝仅复制最外层的容器结构,而内部元素仍引用原对象的子对象;深拷贝则会递归地复制外层容器及其内部所有元素,生成全新的副本。

以下通过一个具体示例来说明这一过程:

>>> x = [2, 3]
>>> y = [7, 11]
>>> z = [x, y]
>>> a = copy.copy(z) # 浅拷贝
>>> a[0] is z[0]
True

拷贝生成的对象a中的元素引用的是x和y。当你修改x的值时,由于a中的元素仍指向原x对象,a的内容也会随之发生变化。

>>> b = copy.deepcopy(z) # 深拷贝
>>> b[0] is z[0]
False

对于深拷贝而言,其内部的元素也被重新创建了一份与x和y等值的新对象。因此,即使修改x和y的值,也不会对对象b产生任何影响。

对列表进行切片操作z[:]或调用对象的copy方法list.copy()均属于浅拷贝范畴。对于自定义对象,开发者还可以通过实现__copy__方法和__deepcopy__方法来定制拷贝行为。

总结

以上内容详细介绍了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 算法库。