Python字典浅拷贝与深拷贝差异及内置属性用法指南

阿澈
阿澈
发布时间:2026-10-12| 5人浏览过
原创

本文详细对比 Python 中字典赋值、浅拷贝与深拷贝的实际行为差异,重点说明嵌套可变对象在内存中的引用关系,并讲解如何利用 __name__、__file__ 和 __doc__ 获取模块运行状态与路径信息,帮助开发者避免数据意外污染并规范脚本结构。

Python 字典复制方法与实际内存行为

在 Python 中进行字典复制时,直接使用赋值号、内置 .copy() 方法或 copy 模块会产生不同的内存引用效果。理解这些差异能有效避免后续数据修改引发的连锁反应。

第1步:使用赋值号创建别名

目的:让两个变量指向内存中的同一字典对象。

dict_obj = {'name': 'wang', 'sex': 'm', 'age': 34, 'job': 'it'}
info_alias = dict_obj  # 仅创建引用别名,不分配新内存空间

此时任意一方对字典进行增删改操作,另一方都会同步变化。

第2步:执行浅拷贝(Shallow Copy)

目的:创建一个新的顶层字典对象,但其内部包含的子对象(如列表、嵌套字典)仍与原字典共享引用。

import copy
info_shallow = dict_obj.copy()          # 等价于 info_shallow = copy.copy(dict_obj)

注意:浅拷贝仅切断顶层键值的直接关联。若原字典第一层嵌套了可变对象,对该嵌套对象的就地修改仍会影响浅拷贝结果;但直接向浅拷贝字典新增或删除第一层键值,不会波及原字典。

第3步:执行深拷贝(Deep Copy)

目的:递归复制所有层级,生成一个完全独立的副本,与原对象无任何内存关联。

info_deep = copy.deepcopy(dict_obj)

以下交互式示例直观展示三类赋值方式在面对不同级别操作时的表现:

>>> dict_obj
{'info': ['a', 'b', 1, 2], 'job': 'it', 'sex': 'm', 'age': 40, 'name': 'wang'}
>>> alias_dict = dict_obj
>>> shallow_dict = copy.copy(dict_obj)
>>> deep_dict = copy.deepcopy(dict_obj)

# 操作A:修改/删除第一层键值 → 浅拷贝与深拷贝均不受影响
>>> dict_obj['age'] = 32
>>> del dict_obj['sex']
>>> dict_obj
{'info': ['a', 'b', 1, 2], 'job': 'it', 'age': 32, 'name': 'wang'}
>>> alias_dict   # 随原字典同步变化
{'info': ['a', 'b', 1, 2], 'job': 'it', 'age': 32, 'name': 'wang'}
>>> shallow_dict # 保持初始状态
{'info': ['a', 'b', 1, 2], 'job': 'it', 'age': 40, 'name': 'wang', 'sex': 'm'}
>>> deep_dict    # 保持初始状态
{'info': ['a', 'b', 1, 2], 'job': 'it', 'age': 40, 'name': 'wang', 'sex': 'm'}

# 操作B:修改原有第二层的嵌套对象 → 浅拷贝受影响,深拷贝独立
>>> dict_obj['info'][2] = 100
>>> dict_obj['info']
['a', 'b', 100, 2]
>>> shallow_dict['info']  # 引用共享导致数据污染
['a', 'b', 100, 2]
>>> deep_dict['info']     # 深度隔离,未受影响
['a', 'b', 1, 2]

# 操作C:新增第一层键(指向新嵌套对象)→ 仅影响当前操作的字典
>>> dict_obj['new'] = {'a': 1, 'c': 5}
>>> 'new' in shallow_dict  # False
>>> 'new' in deep_dict     # False

总结而言,涉及复杂数据结构或需要保留历史快照时,务必优先选用 copy.deepcopy() 以防隐式引用 bug。

模块内置特殊属性:__name__、__file__ 与 __doc__

在编写可复用脚本或库时,常需判断当前文件是作为主程序直接运行,还是被其他文件 import 引入。Python 提供了三个魔术变量用于获取运行环境与元数据:

  • __name__:当文件直接运行时返回 '__main__';作为模块被导入时返回对应文件名(不含后缀)。常用于控制入口逻辑。
  • __file__:返回当前脚本所在的绝对路径字符串,便于动态读取同级资源文件。
  • __doc__:返回文件顶部三引号包裹的文档字符串(Docstring),若未定义则返回 None。

标准验证代码结构如下:

'''
Created by Kevin @ 2015-12-18
Python 字典拷贝与模块属性基础示例
'''

if __name__ == '__main__':
    print('此文件正作为主程序运行')
    print(f'当前文件路径: {__file__}')
    print(f'文档注释内容:\n{__doc__}')

结合上述特性与 if __name__ == '__main__': 守卫语句,可有效分离测试代码与核心逻辑,提升项目模块化程度。

以上就是 Python 字典浅拷贝与深拷贝差异及内置属性用法指南的详细内容,更多关于 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 算法库。