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

相关推荐
weixin_4624462314 分钟前
使用 jsr:@langchain/pyodide-sandbox 构建 Python 安全沙箱(完整入门教程)
python·安全·langchain·sandbox
Loo国昌32 分钟前
【LangChain1.0】第九阶段:文档处理工程 (LlamaIndex)
人工智能·后端·python·算法·langchain
抠头专注python环境配置1 小时前
基于Python与深度学习的智能垃圾分类系统设计与实现
pytorch·python·深度学习·分类·垃圾分类·vgg·densenet
愈努力俞幸运1 小时前
flask 入门 token, headers,cookie
后端·python·flask
梦想是成为算法高手2 小时前
带你从入门到精通——知识图谱(一. 知识图谱入门)
人工智能·pytorch·python·深度学习·神经网络·知识图谱
用什么都重名2 小时前
Conda 虚拟环境安装配置路径详解
windows·python·conda
阿也在北京2 小时前
基于Neo4j和TuGraph的知识图谱与问答系统搭建——胡歌的导演演员人际圈
python·阿里云·知识图谱·neo4j
计算机徐师兄2 小时前
Python基于知识图谱的胆囊炎医疗问答系统(附源码,文档说明)
python·知识图谱·胆囊炎医疗问答系统·python胆囊炎医疗问答系统·知识图谱的胆囊炎医疗问答系统·python知识图谱·医疗问答系统
北冥码鲲2 小时前
【保姆级教程】从零入手:Python + Neo4j 构建你的第一个知识图谱
python·知识图谱·neo4j