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,一经查实,立即删除!

相关文章

在mybatis中resultMap与resultType的区别

MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMapresultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用但是resultType跟resultMap不能同时存在。在MyBatis进行查询映射的时候,其实查询出来…

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

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

QT创建文件夹

最近在做项目的时候,需要创建一个新的文件夹保存临时文件,但是很长时间都没有解决这个问题,今天终于解决了,拿出来和网友分享一下Qt中创建文件夹的方法。如下代码是在单击按钮后,先判断文件夹是否存在,若不…

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

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

Pycharm报错:Process finished with exit code -1066598274 (0xC06D007E)

【问题描述】pycharm运行到np.linalg.slogdet()时报错Process finished with exit code -1066598274 (0xC06D007E),检查发现该函数输入shape就会报错 【解决方法】将python3.8换成python3.6,问题解决!(还是老老实实用3.6吧 -- &am…

rtt 打印 float

/*rtt print float*/float float_value;float_value 3.1415;char float_str[80];sprintf(float_str, "Float value is %f\n", float_value); NRF_LOG_PRINTF(float_str);

Hibernate学习笔记③

数据库关系 多对多:通过第三张表来建立关系 第三张表至少包含两个字段作为外键且字段是其他两张表的主键 Hibernate一对多的操作 (1)一对多映射配置 步骤: 首先创建两个存在一对多关系的实体类两个实体类需要建立一对多的关系:在多…

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

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

AttributeError: ‘version_info‘ object has no attribute ‘version‘

AttributeError: ‘version_info‘ object has no attribute ‘version‘ 解决方法为:pip install pyparsing2.4.7

Qt删除 空格/空白符

QString str " ad dfdsf ef okkd ikk"; str.remove(QRegExp("\\s")); qDebug()<<str.remove(QRegExp("\\s")); "addfdsfefokkdikk"还有去掉前后的空白符 Example: QString str " lots\t of\nwhitespace\r\n "; …

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

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

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

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

儿童书

我要做好孩子转载于:https://www.cnblogs.com/thingk/p/6558903.html

预订态势图

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

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

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

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

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

linux dump_stack

dump_stack():打印出10条函数的调用关系。 定位故障代码:arm-eabi-gdb out/target/product/msm8625/obj/KERNEL_OBJ/vmlinuxgdb) l * i2c_device_probe0xc4

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

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

前端开发中如何将文件夹中的图片变为背景图_Web中的图像技术全面总结,长文干货!...

前端开发人员在构建网站时需要做出的决定之一就是添加图片的技术。它可以是HTML &#xff0c;也可以是通过CSS背景生成的图片&#xff0c;也可以是SVG 。选择正确的技术很重要&#xff0c;并且可以在性能和可访问性方面发挥巨大作用。最简单的情况下&#xff0c;图片元素必须包…