python浅拷贝_Python中的浅拷贝和深拷贝

本文翻译自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()函数返回了一个链表的深拷贝。

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

# 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

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

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

# 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/304241.shtml

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

相关文章

常用计算机二级函数,计算机二级MS office常用函数

计算机二级MS office常用函数1、DAVERAGE用途:返回数据库或数据清单中满足指定条件的列中数值的平均值。语法:DAVERAGE(database,field,criteria)参数:Database 构成列表或数据库的单元格区域;Field指定函数所使用的数…

错误删除linux分区致Win7引导失败的修复方法

以前在Winxp和linux双启动时,若完全 删除了linux分区,重启进不了Winxp时,只需要用Winxp的光盘引导系统到命令行或故障恢复控制台,输入fixmbr和fixboot即可解决。现在是win7系统,命令行已经被修改。昨天我就遇到这问题&…

如何通过自学找到一份开发的工作?

01学习过程比较仔细的学习了《cprimer》,并对每个习题都自己写代码实现了一遍,包括稍微复杂一点的例子。认真读完了《effective c》,《effective stl》。比较仔细的学完了《数据结构与算法分析》,并把其中的每种数据结构和算法都用…

BeetleX使用bootstrap5开发SPA应用

在早期版本BeetleX.WebFamily只提供了vuejselement的集成,由于element只适合PC管理应用开发相对于移动应用适配则没这么方便。在新版本组件集成了bootstrap5可以更好地适配移动Web应用;同时也集成了Fontawesome和bootstrapIcons,这样在开发过程中使用字体…

计算机基础知识菜鸟教程,机器学习基础知识整理归纳

关于机器学习的一些基本概念的整理1.前言1.机器学习是一门致力于研究如何通过计算的手段,利用经验来改善系统自身的性能的学科。1997年Mitchell给出一个更形式化的定义,假设用P来评估计算机程序在某任务类T上的性能,若一个程序通过利用经验E在…

python echo函数_python如何调用php文件中的函数详解

前言python调用php代码实现思路:php文件可通过在terminal中使用php命令行进行调用,因此可使用python开启子进程执行命令行代码。函数所需的参数可通过命令行传递。测试环境1、操作系统:macos10.13.22、php版本:PHP 7.1.7(mac自带)…

今天换了ubuntu10.04

今天换成了ubuntu10.04,开机很快,17秒到登录界面,在我这台dell vostro 1500上很快很快了。快是ubuntu10.04给我的第一印象。至于界面什么的,我真觉得没什么区别,反正我也不开特效,管它呢!反正我…

Jupyter 常见可视化框架的选择

文末有福利!对于以Python作为技术栈的数据科学工作者,Jupyter是不得不提的数据报告工具。可能对于R社区而言,鼎鼎大名的ggplot2是常见的可视化框架,而大家对于Python,以及Jupyter为核心的交互式报告的可个视化方案就并…

AOP(面向切面编程)大概了解一下

前言上一篇在聊MemoryCache的时候,用到了Autofac提供的拦截器进行面向切面编程,很明显能体会到其优势,既然涉及到了,那就趁热打铁,一起来探探面向切面编程。正文1. 概述在软件业,AOP为Aspect Oriented Prog…

es6添加删除class_es6中class类的使用

在es5中我们是使用构造函数实例化出来一个对象,那么构造函数与普通的函数有什么区别呢?其实没有区别,无非就是函数名称用首字母大写来加以区分,这个不用对说对es5有了解的朋友都应该知道。但是es5的这种方式给人的感觉还是不够严谨…

搞定WordPress的日志自动截断

WordPress默认首页显示日志全文,这个很让人受不了,在IC之前就想搞定这个,可是一直没有时间,现在比赛过后,作为休闲,总算是搞定,很多人说用more标签,最后还是用了某位仁兄做的很好的插…

如何选择 WebClient HttpWebRequest HttpClient ?

当我们在用 .NET 调用 RestAPI 时通常有三种选择,分别为:WebClient, HttpWebRequest,HttpClient,这篇文章我们将会讨论如何使用这三种方式去调用 RestAPI,我还会提供相应的代码案例来帮助你更好的理解这三者的概念和使…

gre考试能用计算机么,新GRE考试必须知道的九大考场问题

参加GRE考试须知GRE考场问题1、计算机化GRE考试考场的环境怎样?计算机化考场按照全球统一标准建设,温度适宜,光线充足,隔音效果良好。各个考位由屏风分隔,相对独立。GRE考试须知GRE考场问题2、参加计算机化GRE考试需要携带什么文…

python property setter_Python:动态属性 property setter 以及 __getattr__ 属性

1. property引言:-- 假设有这样一个需求,我们需要创建一个 User 类,并初始化 birthday 参数,之后根据 birthday 计算得到年龄;-- 我们设计下面的代码实现该需求:>>> from datetime import date, d…

机器学习三部曲

随着科技的发展,计算机对人类的生产活动和社会活动产生了极为重要的影响,同时以强大的生命力飞速发展着。目前计算机正广泛用于社会各个领域,并朝着微型化、网络化、智能化和巨型化的方向前进。说到智能化,大家最先想到的应该就是…

AntDesign Pro + .NET Core 实现基于JWT的登录认证

很多同学说AgileConfig的UI实在是太丑了。我想想也是的,本来这个项目是我自己使用的,一开始甚至连UI都没有,全靠手动在数据库里修改数据。后来加上了UI也是使用了老掉牙的bootstrap3做为基础样式。前台框架也是使用了angularjs,同…

武汉大学计算机学院2019考研复试,2019年武汉大学硕士研究生复试及录取名单汇总...

原标题:2019年武汉大学硕士研究生复试及录取名单汇总考生可以通过录取名单了解到很多重要的信息,例如复试比例,进复试最低分,复试录取成绩,录取总评成绩等重要信息。以下是我们整理收集到的各学院复试录取名单汇总&…

ugui unity 取消选择_UGUI中几种不规则按钮的实现方式

前言UGUI中的按钮默认是矩形的,若要实现非矩形按钮该怎么做呢?比如这样的按钮:本文将介绍两种实现方式供大家选择。使用alphaHitTestMinimumThresholdImage类的alphaHitTestMinimumThreshold是一个浮点值,Raycast检测时只有图片中…

你的专业 VS 你妈口中你的专业

亲妈认证★英语语言文学我妈:她就是一个学英语的~我同学:你学英语的啊?那你看美剧不用看字幕的吧?你听英文歌都听得懂的吧?这个怎么翻译啊?这上面写的什么?你不是专八吗?哈喽~ 在吗&…

反射 + 抽象工厂模式切换不同的实现方法

概述工厂模式(Abstract Factory)定义 :提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其…