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

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

本文详细对比 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 相关产品和应用

全部下载

专题列表