本文翻译自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

python浅拷贝_Python中的浅拷贝和深拷贝相关推荐

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

    本文翻译自copy in Python (Deep Copy and Shallow Copy),讲述了在Python语言中浅拷贝与深拷贝的不同用法.全文系作者原创,仅供学习参考使用,转载授权请私信联 ...

  2. 浅拷贝 python_python中的浅拷贝和深拷贝

    http://python.jobbole.com/82294/ Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介 ...

  3. python字符集_PYTHON 中的字符集

    Python中的字符编码是个老生常谈的话题,今天来梳理一下相关知识,希望给其他人些许帮助. Python2的 默认编码 是ASCII,不能识别中文字符,需要显式指定字符编码:Python3的 默认编码 ...

  4. python参数化_Python 中如何实现参数化测试的方法示例

    之前,我曾转过一个单元测试框架系列的文章,里面介绍了 unittest.nose/nose2 与 pytest 这三个最受人欢迎的 Python 测试框架. 本文想针对测试中一种很常见的测试场景,即参 ...

  5. kafka python框架_Python中如何使用Apache Avro——Apache的数据序列化系统

    了解如何创建和使用基于Apache Avro的数据,以实现更好,更有效的传输. 在这篇文章中,我将讨论Apache Avro,这是一种开源数据序列化系统,Spark,Kafka等工具正在使用该工具进行 ...

  6. python标准化_python中标准化

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! sdk 3.0 实现了统一化,各个语言版本的 sdk具备使用方法相同.接口调用方 ...

  7. python中的浅拷贝_python中什么是浅拷贝

    python中浅拷贝是对一个对象最顶层的拷贝. 浅拷贝对可变数据类型会拷贝这个对象的引用:对于不可变数据类型进行对象资源的拷贝,即只拷贝对象的数据内容和父对象,不拷贝对象内部的子对象. 在python ...

  8. python语音识别_Python中的语音识别-完整的入门指南

    python语音识别 Welcome to The Complete Beginner's Guide to Speech Recognition in Python. 欢迎使用Python语音识别完 ...

  9. python 多态_Python中的多态

    面向对象的语言有四个特性,抽象.封装.继承和多态.在之前的文章中,给小伙伴们已经讲解了前三个.为什么要把多态放在最后一个讲呢?因为前面的三个特性是多态的基础,了解了前三个,了解多态就很容易啦~ 那么, ...

最新文章

  1. 图论 ---- F. Useful Edges(不等式移项优化预处理 + 路径和简单路径的区别 + 最短路)
  2. 基于SSL的mysql(MariaDB)主从复制
  3. 根据数据库中不同的值显示不同的图片
  4. nginx 上传文件漏洞_nginx爆惊天漏洞 上传图片就能入侵服务器
  5. 【STL源码剖析读书笔记】【第6章】算法之partition算法
  6. 吃番薯叶有什么好处?
  7. 怎么使用可视化数据库工具 DBeaver 连接本地数据库?
  8. 声纹识别demo_科学网—声纹识别、说话人识别软件,SPEAKER v0.1 - 石自强的博文...
  9. 详解语言模型NGram及困惑度Perplexity
  10. Unity Spine动画如何选定帧数(时间)播放
  11. 不解压压缩包直接解析内部文件(zip)
  12. 同盾科技声纹识别建模大赛
  13. ③电子产品拆解分析-充电宝台灯
  14. 音曼Omnos 5.1全景声音响全网首评 声音惊艳
  15. 如何在wince下添加和删除驱动(作者:wogoyixikexie@gliet)
  16. 网页服务器修复,网页被劫持,跳转发布网修复方法 看完就明白
  17. 算法竞赛入门【码蹄集进阶塔335题】(MT2076-2100)
  18. Python基础---输入和输出
  19. TCP/IP网络模型之异步选择模型
  20. 联想小新padpro怎么样?测评值得买吗?详细性能点评

热门文章

  1. .NET Core 2.1中的HttpClientFactory最佳实践
  2. Hangfire使用ApplicationInsigts监控
  3. 听说你开发.NET还在用VS,小哥哥给你推荐全平台的Rider
  4. ASP.NET MVC使用Oauth2.0实现身份验证
  5. 虚拟研讨会:.NET的未来在哪里?
  6. 最新版dotnet-cli下的ASP.NET Core和asp.net mvc【RC2尝鲜】
  7. 【Python可视化】利用Numpy绘制各种统计图表
  8. WCF服务自托管(Self-Hosting)
  9. ENVI支持下利用高分辨率影像城市绿地信息提取方案
  10. Visual Studio与C#编程十个实用技巧