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 的值。 如下图所示:

相关推荐
std860216 分钟前
Rust 与 Python – 这是未来的语言吗?
开发语言·python·rust
鄃鳕19 分钟前
Flask【python】
后端·python·flask
weixin_466823 分钟前
Python编程之面向对象
开发语言·人工智能·python
Lynnxiaowen1 小时前
今天我们学习python编程常用模块与面向对象
运维·python·学习·云计算
一头生产的驴1 小时前
java整合itext pdf实现固定模版pdf导出
java·python·pdf
魔都吴所谓1 小时前
【python】快速实现pdf批量去除指定位置水印
java·python·pdf
YFCodeDream2 小时前
MLLM技术报告 核心创新一览
python·gpt·aigc
夜幽青玄3 小时前
mybatis-plus调用报 org.springframework.dao.DataIntegrityViolationException 错误处理
开发语言·python·mybatis
这里有鱼汤4 小时前
📊量化实战篇:如何计算RSI指标的“拥挤度指标”?
后端·python
JJJJ_iii4 小时前
【机器学习05】神经网络、模型表示、前向传播、TensorFlow实现
人工智能·pytorch·python·深度学习·神经网络·机器学习·tensorflow