python中有一个模块copy,deepcopy函数用于深拷贝,copy函数用于浅拷贝。

要理解浅拷贝,必须先弄清楚python中的引用。

引用

Python中一切都是对象,变量中存放的是对象的引用

这是一个普遍的法则。

能够说 Python 没有赋值,仅仅有引用

如。a=1,变量a仅仅是整数对象1的引用。

可变对象与不可变对象及其引用

一、不可变对象

不可变对象包含:数字,字符串,元组。
因为Python中的变量存放的是对象引用。所以对于不可变对象而言,虽然对象本身不可变。但变量的对象引用是可变的。运用这种机制,有时候会让人产生糊涂,似乎可变对象变化了。如以下的代码:
i=73
i+=2

这里的‘=’表示引用。

从上面得知。不可变的对象的特征没有变,依旧是不可变对象,变的仅仅是创建了新对象,改变了变量的对象引用。

二、可变对象

可变对象包含:列表、字典
其对象的内容是能够变化的。

当对象的内容发生变化时。变量的对象引用是不会变化的。如以下的样例。

m=[5,9]
m+=[6]

列表m的每一个元素均是对象的引用。对象的生成。涉及到相应机制。如整形对象分为大整数对象和小整数对象,生成机制不同,这里不作具体阐述。

三、函数的參数传递

函数的參数传递。本质上传递的是引用。

拷贝

(1)没有限制条件的分片表达式(L[:])可以复制序列,但此法仅仅能浅层复制。

(2)字典 copy 方法。D.copy() 可以复制字典,但此法仅仅能浅层复制

(3)有些内置函数。比如 list,可以生成拷贝 list(L)

(4)copy 标准库模块可以生成完整拷贝:deepcopy,递归 copy

浅拷贝

浅拷贝由copy模块中的copy()函数实现。简单地说,copy.copy 浅拷贝 仅仅拷贝父对象,不会拷贝对象的内部的可变子对象。

详细点说就是。

浅拷贝是指拷贝的仅仅是原对象元素的引用,换句话说,浅拷贝产生的对象本身是新的,可是它的内容不是新的,仅仅是对原子对象的一个引用。


import copy
aList=[[1,2],3,4]
bList=copy.copy(aList)
print aList
print bListprint id(aList)
print id(bList)aList[0][0]=5print aList
print bList

由id(aList)不等于id(bList),表明浅拷贝产生的对象本身是新的。可是它的子对象(即,那个列表)是对原子对象的一个引用。那么3,4两个元素呢?这就要讲讲python中的可变对象和不可变对象的引用了。

可是有点须要特别提醒的,假设对象本身是不可变的,那么浅拷贝时也是引用。
见这个样例:
import copy
aList=[[1,2],3,4]
bList=copy.copy(aList)
print aList
print bListprint id(aList[1])
print id(bList[1])aList[2]=5#变量的对象引用改变了而已
aList[0]=[0,1,1]#变量的对象引用改变了而已print aList
print bList

总结,即浅拷贝产生的对象本身是新的。可是它的内容不是新的,仅仅是对原子对象的一个引用。

深拷贝

浅拷贝由copy模块中的deepcopy()函数实现,简单地说。深拷贝 拷贝对象及其子对象。
一个样例展示引用、深拷贝与浅拷贝的不同。
import copy
aList=[[1,2],3,4]
bList=aList
cList=copy.copy(aList)
dList=copy.deepcopy(aList)
print aList
print bList
print cList
print dList
print id(aList)
print id(bList)
print id(cList)
print id(dList)
aList.append(5)
aList[0].append('hello')print aList
print bList
print cList
print dList

事实上我认为记住这一点即可,浅拷贝产生的对象本身是新的,可是它的内容不是新的。仅仅是对原子对象的一个引用。关键是要理解python中引用的含义。


一入python深似海--浅拷贝与深拷贝相关推荐

  1. python之道_一入python深似海--python之道

    The Zen of Python, by Tim Peters Python之道 Beautiful is better than ugly. 美观胜于丑陋. Explicit is better ...

  2. 一入python深似海--正則表達式

    字符串是编程时涉及到的最多的一种数据结构.对字符串进行操作的需求差点儿无处不在.比方推断一个字符串是否是一个合法的Email地址.尽管能够编程提取@前后的子串,再分别推断是否是单词和域名,但这样做不但 ...

  3. 您为了什么而学?【一入红尘深似海 勿负天下有心人】

    踏入凡尘皆天意,何论成败论英雄.徒步跌撞几十载,辗转功成犹可期. 莫问天下谁有心,功臻造化皆回首.以往征途一心否,成负天下不负君. 世间本就无难事,唯有敢于攀登者.纸上谈兵不可为,欲成由心是为谁? 坎 ...

  4. 「一入 Java 深似海 」系列课程

    第一期 「一入 Java 深似海 」系列课程 - 第一期 第一节:Java 语言基础 转载于:https://www.cnblogs.com/wangjunwei/p/10393306.html

  5. 一入编码深似海,在达观数据做程序员是怎样一种体验?

    在技术浪潮一波接一波推动人类社会前进的历史进程当中,程序员始终是站在浪尖的群体.2014年起,把每年10月24日(2^10)定义为程序员节.这可能是唯一一个与数字紧密相关的节日--也体现了这个节日的含 ...

  6. 一入IT深似海 从此妹子为路人

    一入IT深似海,从此妹子为路人.....传者网的那个什么 在我还不知道程序员是什么的时候就选择了编程这条道路,直到现在我不得不说,程序对我吸引真的很大,我喜欢写代码,因为能给人带来成就感.记得当年老师 ...

  7. 一入Java 深似海

    「一入 Java 深似海 」系列是小马哥 2019 年在 SegmentFault 平台发布的全新付费课程,内容围绕 Java 生态体系而展开,从编程语言.编程模型.代码设计,框架实现以及架构实践等, ...

  8. 数赢云CTO『朱炜』丨一入创业深似海……

    关注"Ai时速"  智慧赢未来!  Ai时速  因着Ai的美好:用激情和速度体验Ai时代! 职业创业|PK分享|进化成长 朱炜 写在前面 " 生命在于折腾,技术改变未来! ...

  9. Java实现小猪佩奇_一入java深似海(1-4期 完整版)

    『课程目录』: ├─第1期 │      开篇 一入 Java 深似?,从此"劝退"成必然.mp4 │      第1节:Java语言基础.mp4 │      第2节:Java面 ...

最新文章

  1. keras merge
  2. java中的compareTo函数
  3. UML序列图总结(Loop、Opt、Par和Alt)
  4. ActiveMQ搭建
  5. 分享一个剪切板的小软件CopyQ
  6. Java 包及访问权限
  7. Cassandra Java堆外内存排查经历全记录
  8. linux搭建SonarQube代码质量平台_Oracle 最新详细版本
  9. 使用Tab Bar切换视图
  10. 分割字符串s使得每个子串都是回文串
  11. Metal:对 iOS 中 GPU 编程的高度优化的框架
  12. MooTools官方插件 - Chain.Wait
  13. TCS2010(中国标准编写模板)安装教程+解决三级标题条无法设置
  14. 获取某一天的开始时间
  15. 微信内置浏览器网页刷新
  16. The Shawshank Redemption-3
  17. mvc 框架ember.js的简单介绍
  18. 读取和讯博客数据可视化分析
  19. IT30: IT人怎样成为解决问题的高手
  20. [洛谷P4707]重返现世

热门文章

  1. Azure PowerShell (13) 批量设置Azure ARM Network Security Group (NSG)
  2. 视频过大怎么压缩变小
  3. zip压缩/tar打包
  4. office工具包开源了,使用Excel导入导出非常方便
  5. 查看eclipse使用的jre版本
  6. windows服务器批量绑定Ip
  7. 主域控制器硬件损坏,你会怎么解决?(四)
  8. [导入]Fedora Linux 9 的硬盘安装
  9. 问题六十七:ray tracing学习总结(2016.11.13, 2017.02.05)
  10. Flink的Table和SQL的基本API