clone是深拷贝还是浅拷贝_Python中的浅拷贝和深拷贝

caeaa20d272e82e3c0c4674069729f95.png

本文翻译自copy in Python (Deep Copy and Shallow Copy),讲述了在Python语言中浅拷贝与深拷贝的不同用法。全文系作者原创,仅供学习参考使用,转载授权请私信联系,否则将视为侵权行为。码字不易,感谢支持。以下为全文内容:


在Python中,赋值语句不复制对象,它们只是在目标和对象之间创建绑定。当我们使用=运算符时,用户认为这会创建一个新对象;好吧,其实并没有。它只创建一个共享原始对象引用的新变量。有时用户想要使用可变对象,为了做到这一点,用户希望找到创建这些对象的“真实副本”或“克隆”的方法。或者,有时用户想要一个可以被修改的副本而不会同时自动修改原件,为此,我们需要创建对象的副本。

拷贝在某些情况下是需要的,从而能让我们在修改副本的同时不改动原始对象。在Python中有两种创建拷贝的方式:

  • 深拷贝
  • 浅拷贝

为了进行拷贝操作,我们需要引用copy模块。我们使用copy模块进行浅拷贝和深拷贝的操作,例如:

# importing copy module 
import copy # initializing list 1 
li1 = [1, 2, [3,5], 4] # using copy for shallow copy 
li2 = copy.copy(li1) # using deepcopy for deepcopy 
li3 = copy.deepcopy(li1)

在上述代码中,copy()函数返回了一个链表的浅拷贝而deepcopy()函数返回了一个链表的深拷贝。

583e7fb0058907ab0b1e3df206ca1762.png


进行深拷贝时会递归地执行对象的拷贝过程。这意味着它首先创建一个新的集合对象,然后递归地使用原始对象中所有子对象的拷贝来填充这个新的集合对象。在深拷贝中,一个对象会被完整地复制到另一个对象中。这意味着发生在新对象中的所有修改都不会影响到原始对象。观察下面的代码:

# Python code to demonstrate copy operations # importing "copy" for copy operations 
import copy # initializing list 1 
li1 = [1, 2, [3,5], 4] # using deepcopy to deep copy 
li2 = copy.deepcopy(li1) # original elements of list 
print ("The original elements before deep copying") 
for i in range(0,len(li1)): print (li1[i],end=" ") print("r") # adding and element to new list 
li2[2][0] = 7# Change is reflected in l2 
print ("The new list of elements after deep copying ") 
for i in range(0,len( li1)): print (li2[i],end=" ") print("r") # Change is NOT reflected in original list 
# as it is a deep copy 
print ("The original elements after deep copying") 
for i in range(0,len( li1)): print (li1[i],end=" ")

Output:

The original elements before deep copying
1 2 [3, 5] 4 
The new list of elements after deep copying 
1 2 [7, 5] 4 
The original elements after deep copying
1 2 [3, 5] 4

在上面的例子中,在新的链表中发生的修改并不会反映在原始的链表中,表明这是一个深拷贝的操作。

e5ad3dc559f6f3a82c7af9bbeebaa1f4.png

一个浅拷贝意味着创建一个新的集合对象并用原始对象中子对象的引用来填充新对象。拷贝的过程并不是递归的,因此不会创建子对象的拷贝。对于浅拷贝来说,是在另一个对象中创建了对象的引用。这意味着对新对象采取的所有修改也会同时影响原来的对象。比如:

# Python code to demonstrate copy operations # importing "copy" for copy operations 
import copy # initializing list 1 
li1 = [1, 2, [3,5], 4] # using copy to shallow copy 
li2 = copy.copy(li1) # original elements of list 
print ("The original elements before shallow copying") 
for i in range(0,len(li1)): print (li1[i],end=" ") print("r") # adding and element to new list 
li2[2][0] = 7# checking if change is reflected 
print ("The original elements after shallow copying") 
for i in range(0,len( li1)): print (li1[i],end=" ")

Output:

The original elements before shallow copying
1 2 [3, 5] 4 
The original elements after shallow copying
1 2 [7, 5] 4

在上例中,在新的链表中的修改使得原始链表也被同时修改了,表明这是一个浅拷贝操作。

注意事项:

浅拷贝和深拷贝之间的区别仅与复合对象有关(指那些本身包含了其他对象的对象,比如链表或者类的实例):

  • 浅拷贝构造一个新的复合对象,然后(尽可能)将对它的引用插入到原始对象中。
  • 深拷贝构造一个新的复合对象,然后递归地将复制对象插入到原始对象中找到的对象中。

以上就是本文的全部内容,如果您喜欢这篇文章,欢迎将它分享给朋友们。

感谢您的阅读,祝您生活愉快!

作者:小美哥
2019-03-17

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Pytorch神经网络实战案例】32 使用Transformers库的管道方式实现:加载指定模型+文本分类+掩码语言建模+摘要生成+特征提取+阅读理解+实体词识别

管道方式是Transformers库中高度集成的极简使用方式。使用这种方式来处理NLP任务,只需要编写几行代码就能实现。通过本例的练习可以使读者对Transformers库的使用快速上手。 1 在管道方式中指定NLP任务 Transfomers库的管道方式使用起来非常简单,核心步…

jqprint获取打印页数_如何将每张打印多页PPT的PDF变成常规课件

在工作和学习中,经常会收到各种 PDF 文件,尤其是老师的课件。为了防止学生大量上传到各种文库网站赚积分,或者为了方便学生打印出来预习复习。通常,会在每页 PDF 里面,打印多张 PPT 内容。一般是 6 张或 9 张&#xff…

vba 判断文本框内容是否为空_【VBA】 数据输入 Inputbox 基本语法

在使用Excel 的过程中,如果需要用户输入简单的数据,作为“已知数”,那么可以使用inputbox 函数显示一个对话框,供用户在对话框中输入数据。 Inputbox 函数语法在一对话框来中显示提示,等待用户输入正文或按下按钮&…

无向图的深度优先遍历非递归_LeetCode0429: N叉树的层序遍历

题目介绍描述:给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。例如,给定一个 3叉树 :返回其层序遍历:[[1],[3,2,4],[5,6] ]说明:树的深度不会超过 1000。 树的节点总数不会超过 5000。解题思路:★ …

一条龙操作有效解决PermissionError: [WinError 5] 拒绝访问的问题

1 问题描述 当在使用pip install 安装包时,如:pip install scrapy scrapyd scrapyd-client spiderkeeper出现报错:PermissionError: [WinError 5] 拒绝访问。: ‘c:\programdata\anaconda3\lib\site-packages\dateutil\easter.py’ 2 解决办…

预订态势图

//预订态势图JS//根据日期得到对应星期几 function getWeekByDay(riqi){//2017-01-23;var getWeek "";var arys1 new Array(); arys1riqi.split(-); //日期为输入日期,格式为 2013-3-10var ssdatenew Date(arys1[0],parseInt(arys1[1]-1),arys1…

altera fpga sdi输出方案_FPGA在电力电子中的应用有哪些?

大家好,很抱歉上周末没有及时更新公众号,本来这期想聊聊IGBT的拖尾电流,但是由于周末去深圳高交会(高新技术成果交易会)逛了一天,时间给耽搁了,感觉要想把拖尾电流讲清楚也不太容易,还得需要点时间&#xf…

【Pytorch神经网络理论篇】 39 Transformers库中的BERTology系列模型

同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)目录地址…

Unity之CharacterController2D学习笔记(1)——基础使用

在很多游戏类型中,玩家角色对物理行为的处理往往和场景中其它物体的行为有比较大的区别。比如角色可能会以90多公里的时速狂奔,同时一次跳跃能跳10多米高,与此同时却几乎不会有任何惯性。同时角色在正常情况下当头部碰到障碍物的时候&#xf…

【Pytorch神经网络实战案例】33 使用BERT模型实现完形填空任务

1 案例描述 案例:加载Transformers库中的BERT模型,并用它实现完形填空任务,即预测一个句子中缺失的单词。 2 代码实现:使用BERT模型实现完形填空任务 2.1 代码实现:载入词表,并对输入的文本进行分词转化--…

c++ string 删除字符_字符串操作的全面总结

来自公众号:C语言与cpp编程字符串操作看似简单,其实非常重要,不注意的话,经常出现代码运行结果和自己想要的不一致,甚至崩溃。本文总结了一些构建string对象方法、修改string对象的方法、string类型的操作函数、string…

【Pytorch神经网络理论篇】 40 Transformers中的词表工具Tokenizer

同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)目录地址…

【Pytorch神经网络实战案例】34 使用GPT-2模型实现句子补全功能(手动加载)

1 GPT-2 模型结构 GPT-2的整体结构如下图,GPT-2是以Transformer为基础构建的,使用字节对编码的方法进行数据预处理,通过预测下一个词任务进行预训练的语言模型。 1.1 GPT-2 功能简介 GPT-2 就是一个语言模型,能够根据上文预测下…

电容式传感器位移性能试验报告_一文读懂什么是接近传感器?

点击上方蓝字 记得关注我们哦!接近传感器是一种非接触式传感器,当目标进入传感器的视野时,它会检测到物体(通常称为“目标”)的存在。取决于接近传感器的类型,传感器可以利用声音,光,红外辐射(IR)或电磁场来…

[dts]DTS实例分析

2. 通常会碰到的实际问题 到此,问题出现了: 1. 当写一个按键驱动,应该如何在*.dts或者*.dtsi中操作? 2. 当在串口driver中需要使用到某个pin脚作为普通输出IO,该如何操作? 3. 当在串口driver中需要使用某个muxpin脚作…

【解决】YOLOv6.1安装requirements.txt报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x84

案例描述: 使用YOLOV5时,报错解决UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x84 in position 285: illegal multibyte sequence 解决方案: 在C:\ProgramData\Anaconda3\lib\distutils\dist.py"文件搜索read 将parser.read(filenam…

bp 神经网络 优点 不足_深度学习之BP神经网络--Stata和R同步实现(附Stata数据和代码)

说明:本文原发于“计量经济圈”公众号,在此仅展示Stata的部分。R部分请移步至本人主页的“R语言与机器学习--经济学视角”专栏,或点击下方链接卡跳转。盲区行者:深度学习之BP神经网络--Stata和R同步实现(附R数据和代码…

Win10系统下使用anaconda在虚拟环境下安装CUDA及CUDNN

前排预警:不要挂梯子!!!!!使用清华源就行不然报错!!!! 解决check_hostname requires server_hostname_orange_の_呜的博客-CSDN博客错误描述在GitHub下载代码文件后使用pip install -r requirement.txt下载依赖包时出…

将XML格式转化为YOLO需要的txt格式(代码)

1、XML的格式 <annotation><folder>cr</folder><filename>crazing_2.jpg</filename><source><database>NEU-DET</database></source><size><width>200</width><height>200</height><…

js 点击button切换颜色_ThingJS 和three.js开发示例对比,让开发早点下班回家!3D 可视化...

ThingJS 3D框架简化了开发工作&#xff0c;面向对象和模块化的特点使得网页代码更加易于管理和维护&#xff0c;并且提供近200个官方示例&#xff0c;直接获取API能力&#xff0c;不需要基于3D概念进行开发&#xff0c;适合3D商业项目快速生成&#xff01;距离您的业务仅一层之…