Python赋值与深浅拷贝机制解析

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

本文解析Python中赋值操作与对象引用的关系,详解使用copy模块进行浅拷贝和深拷贝的区别。通过代码示例说明浅拷贝仅复制第一层对象而共享嵌套对象,深拷贝则完全独立复制所有层级,帮助开发者避免内存引用导致的意外修改。

在Python中,执行 A = B 属于赋值操作。该操作并非将对象在内存中的完整副本赋予A,而是将B对象在内存中的引用地址赋给A,使得A和B指向同一个内存空间。

基于上述引用机制,当B对象内部的内容发生修改时,由于A与B共享同一内存地址,A对象的内容也会随之同步改变。

name = ["root","admin"]
cp_name = name # 对cp_name进行赋值操作
# 对name列表进行插入
name.append('root_temp')
print(name,cp_name) # ['root', 'admin', 'root_temp'] ['root', 'admin', 'root_temp']
print(id(name),id(cp_name)) # 23991960 23991960

若需实现对象的独立拷贝,无论是浅拷贝还是深拷贝,均需引入Python标准库中的copy模块。

首先介绍浅拷贝的实现方式,即调用copy.copy()函数。

import copy
name = ["root","admin"]
# 进行浅拷贝操作
cp_name = copy.copy(name)
# 查看cp_name,name
print(name,cp_name) # ['root', 'admin'] ['root', 'admin'] 拷贝成功
#查看地址
print(id(name),id(cp_name)) # 21146920 21147160 内存地址并不相同
# 尝试对name进行更改
name.append('root_temp')
# 查看cp_name是否更改
print(cp_name) # ['root', 'admin'] 内容并没有更改

执行 A = copy.copy(B) 时,系统会为A分配新的内存地址,并将B对象第一层的数据完整复制到该新地址中,从而实现A与B在顶层数据的独立存储。

具体实现细节如下所示:

import copy
name = ['root','admin',['root_temp','admin_temp']]
cp_name = copy.copy(name)
# 查看两个对象的地址
print(id(name),id(cp_name)) # 24358504 24428952 二者的地址并不相同
# 对name 进行更改
name.append('test')
# 查看cp_name是否更改
print(cp_name) # ['root', 'admin', ['root_temp', 'admin_temp']] cp_name并未更改
# 在来对name中的列表对象进行更改
name[2].append('ttttt')
print(cp_name) # ['root', 'admin', ['root_temp', 'admin_temp', 'ttttt']] 发现cp_name内容发生了变化

在上述代码逻辑中,通过copy.copy()将name列表浅拷贝至cp_name。尽管二者内容一致,但内存地址不同,表明浅拷贝为cp_name开辟了独立的一级内存空间。因此,当对name执行第一次append()插入操作时,cp_name的内容保持不变,因为两者在一级列表层面是相互独立的。

然而,浅拷贝存在局限性:它仅复制对象的第一层数据。对于第二层及更深层级的嵌套对象,浅拷贝仅复制其内存引用地址,而无法复制实际内容。

因此,对于name列表,若仅修改第一层数据,cp_name不受影响;但若修改第二层或更深层级的嵌套列表内容,由于cp_name中的子列表与name中的子列表指向相同的内存地址,cp_name的内容也会随之改变。

若需对第一层及所有嵌套层级(如第二层、第n层)进行完全独立的拷贝,必须采用深拷贝策略。

实现深拷贝需调用copy模块中的deepcopy()方法。

import copy
name = ['root','admin',['root_temp','admin_temp']]
cp_name = copy.deepcopy(name)
# 查看二者的id
print(id(name),id(cp_name)) # 29863528 29933976 地址不同,说明开辟了处于两块不同的空间
# 对name 第一层以及第二层进行更改
name.append('t1')
name[2].append('t2')
# 查看cp_name是否内容发生变化
print(cp_name) # ['root', 'admin', ['root_temp', 'admin_temp']] 内容并未发生更改

使用deepcopy()后,cp_name对象完全独立于name。无论name的第一层还是第n层数据发生何种更改,cp_name均不受影响。这是因为深拷贝为所有层级的对象都开辟了全新的、独立的内存空间,实现了彻底的隔离。

总结

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