python 直接引用、浅拷贝、深拷贝的区别

1. 简述

简单来讲,直接引用所指向的地址是原对象的地址,深拷贝所指向的是新对象的地址,浅拷贝介于二者之间,原对象的直接子对象为新,子孙对象为原子孙对象。

下面用两个变量 a、b,一个字典对象 {'aaa': 'asd', 'bbb': [1, 2, 3]}(暂时用 DICT 标识)来具体说明。

2. 直接引用

如果 a、b 都是直接引用(a = DICT;b = DICT),则两个变量指向的是同一个对象 DICT,a 与 b 都可以用来改变 DICT 的值; 如下图所示:

3. 浅拷贝

如果 a 是直接引用,b 为浅拷贝(a = DICT;b = DICT.copy()),则变量 b 指向另一个对象 DICT_2,DICT_2 将 DICT 中不可变对象的值进行拷贝,可变对象的值直接引用。 即 DICT_2 中 键aaa 指向的对象与 DICT中 键aaa 指向的不是同一个对象,键bbb 指向的对象与 DICT中 键bbb 指向的是同一个对象,修改 b['bbb'] 会影响到 DICT 的值。 如下图所示:

4. 深拷贝

深拷贝可以用 copy 库的 deepcopy 函数实现。

如果 a 是直接引用,b 为深拷贝(a = DICT;b = copy.deepcopy(DICT)),则变量 b 指向另一个对象 DICT_2,DICT_2 将 DICT 中所有对象的值进行拷贝。 即 DICT_2中 键bbb 指向的对象与 DICT中 键bbb 指向的不是同一个对象,修改 b['bbb'] 不会影响 DICT 的值。 如下图所示:

相关推荐
Dxy123931021636 分钟前
Python基于BERT的上下文纠错详解
开发语言·python·bert
SiYuanFeng2 小时前
Colab复现 NanoChat:从 Tokenizer(CPU)、Base Train(CPU) 到 SFT(GPU) 的完整踩坑实录
python·colab
炸炸鱼.3 小时前
Python 操作 MySQL 数据库
android·数据库·python·adb
_深海凉_3 小时前
LeetCode热题100-颜色分类
python·算法·leetcode
AC赳赳老秦4 小时前
OpenClaw email技能:批量发送邮件、自动回复,高效处理工作邮件
运维·人工智能·python·django·自动化·deepseek·openclaw
zhaoshuzhaoshu4 小时前
Python 语法之数据结构详细解析
python
AI问答工程师4 小时前
Meta Muse Spark 的"思维压缩"到底是什么?我用 Python 复现了核心思路(附代码)
人工智能·python
zfan5205 小时前
python对Excel数据处理(1)
python·excel·pandas
小饕5 小时前
我从零搭建 RAG 学到的 10 件事
python
老歌老听老掉牙5 小时前
PyQt5+Qt Designer实战:可视化设计智能参数配置界面,告别手动布局时代!
python·qt