浅谈python 复制(深拷贝,浅拷贝)
博客参考:点击这里
python中对象的复制以及浅拷贝,深拷贝是存在差异的,这儿我们主要以可变变量来演示,不可变变量则不存在赋值/拷贝上的问题(下文会有解释),具体差异如下文所示
1.赋值:
a=[1,2,3]
b=a
a.append('')
print 'b=',b
实例输出结果如下:
b= [1, 2, 3, '']
这儿我们只对列表a进行了操作,但列表b也随之改变,根本原因是在进行赋值操作的时候,变量a与变量b指向了相同的内存地址,实例如下:
#coding=utf-8
a=[1,2,3]
b=a
print "变量a的内存地址:",id(a) #获取变量的内存地址
print "变量b的内存地址:",id(b)
a.append(4)
print "变量a的内存地址:",id(a)
print "变量b的内存地址:",id(b)
输出结果如下:
变量a的内存地址: 39012592
变量b的内存地址: 39012592
变量a的内存地址: 39012592
变量b的内存地址: 39012592
以上结果可以看出进行赋值操作时变量与变量b的内存地址一致,故而在变量a值发生改变时,变量b的值也随之改变。
但这种情况只针对可变变量,str属于不可变变量,值发生改变的时候会重新申请新的地址,实例如下:
#coding=utf-8
a=''
print ' 变量a的内存地址:',id(a)
a=''
print ' 变量a的内存地址:',id(a)
输出结果如下:
变量a的内存地址: 38734832
变量a的内存地址: 38734856
2.浅拷贝(copy.copy())
#coding=utf-8
import copy
a=[1,2,3]
b=copy.copy(a)
print ' 变量a的内存地址:',id(a)
print ' 变量b的内存地址:',id(b)
a.append(4)
print b
输出结果:
变量a的内存地址: 38160664
变量b的内存地址: 38203224
[1, 2, 3]
因为变量a与变量b的内存地址不一样,故而在变量a发生改变时,变量b未改变,但因为浅拷贝依然会使用原始变量中元素的地址,实例如下:
#coding=utf-8
import copy
a=[1,2,3]
b=copy.copy(a)
for i in range(0,len(a)):
print ' 变量a中第%d的内存地址:%d'%(i,id(a[i]))
for i in range(0,len(b)):
print ' 变量b中第%d的内存地址:%d'%(i,id(b[i]))
输出结果:
变量a中第0的内存地址:33860840
变量a中第1的内存地址:33860828
变量a中第2的内存地址:33860816
变量b中第0的内存地址:33860840
变量b中第1的内存地址:33860828
变量b中第2的内存地址:33860816
由输出结果可知,变量a和变量b中的元素的内存地址是一致的,当变量a中存在可变元素时,对可变元素进行更改,变量b依然会同时进行更改,实例如下:
#coding=utf-8
import copy
a=[1,2,3,[11,2,3]]
b=copy.copy(a)
print '变量a修改前,b的内容:',b
a[3].append(4)
print '变量a修改后,b的内容:',b
输出如下:
变量a修改前,b的内容: [1, 2, 3, [11, 2, 3]]
变量a修改后,b的内容: [1, 2, 3, [11, 2, 3, 4]]
3.深拷贝(copy.deepcopy())
#coding=utf-8
import copy
a=[1,2,3,[11,2,3]]
b=copy.deepcopy(a)
for i in range(0,len(a)):
print ' 变量a中第%d的内存地址:%d'%(i,id(a[i]))
for i in range(0,len(b)):
print ' 变量b中第%d的内存地址:%d'%(i,id(b[i]))
输出如下:
变量a中第0的内存地址:30518504
变量a中第1的内存地址:30518492
变量a中第2的内存地址:30518480
变量a中第3的内存地址:38553880
变量b中第0的内存地址:30518504
变量b中第1的内存地址:30518492
变量b中第2的内存地址:30518480
变量b中第3的内存地址:38643072
变量a与变量b中的每一个元素的内存地址都不相同,故而变量a发生改变时,变量b不会随之改变。
总结:
1.赋值,浅拷贝,深拷贝只针对可变变量,如list,dict,tuple
2.python中赋值都是进行内存地址的传递
3.浅拷贝(copy,copy())只会赋值对象,重新申请内存地址,但对于对象中的元素依然是原始的内存地址引用
4.如果要完全拷贝一个对象,请使用copy.deepcopy()
写在后面:
每天写一点,总有一天我这条咸鱼能变得更咸
浅谈python 复制(深拷贝,浅拷贝)的更多相关文章
- 浅谈Python时间模块
浅谈Python时间模块 今天简单总结了一下Python处理时间和日期方面的模块,主要就是datetime.time.calendar三个模块的使用.希望这篇文章对于学习Python的朋友们有所帮助 ...
- 浅谈Python在信息学竞赛中的运用及Python的基本用法
浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...
- 浅谈python字符串存储形式
http://blog.csdn.net/zhonghuan1992 钟桓 2014年8月31日 浅谈python字符串存储形式 记录一下自己今的天发现疑问而且给出自己现有知识有的回答. 长话短说,用 ...
- 开发技术--浅谈Python函数
开发|浅谈Python函数 函数在实际使用中有很多不一样的小九九,我将从最基础的函数内容,延伸出函数的高级用法.此文非科普片~~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点 ...
- 开发技术--浅谈python数据类型
开发|浅谈python数据类型 在回顾Python基础的时候,遇到最大的问题就是内容很多,而我的目的是回顾自己之前学习的内容,进行相应的总结,所以我就不玩基础了,很多在我实际生活中使用的东西,我会在文 ...
- 开发技术--浅谈python基础知识
开发|浅谈python基础知识 最近复习一些基础内容,故将Python的基础进行了总结.注意:这篇文章只列出来我觉得重点,并且需要记忆的知识. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对 ...
- 浅谈js中的浅拷贝和深拷贝
在js中如何把一个对象里的属性和方法复制给另一个对象呢? 下面举一个例子来说明: var person={name:'chen',age:18}; var son={sex:'男'}; functio ...
- 【javascript】浅谈javaScript的深拷贝
前言: 最开始意识到深拷贝的重要性是在我使用redux的时候(react + redux), redux的机制要求在reducer中必须返回一个新的对象,而不能对原来的对象做改动,事实上,当时 ...
- [转]浅谈Python web框架
说到web framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见:http://wi ...
随机推荐
- 第二次项目冲刺(Beta阶段)--第二天
一.站立式会议照片 二.项目燃尽图 三.项目进展 功能模块的代码编写完成,界面布局规划已经定型,不会有大的修改,接下去就是主要解决存在的bug以及各种测试. 队员 ID 贡献比 王若凡 201421 ...
- 团队作业8----第二次项目冲刺(beta阶段)5.20
Day2--5.20 1.每日讨论 会议内容:1.新成员乔桦和周迪慢慢了解项目. 2.组内负责主要编程的益靖对代码进行了大概的说明. 3.对昨天的工作进行了几点总结. 4.组长对每个成员的任务完成了分 ...
- 201521123019 《Java程序设计》第4周学习总结
1. 本章学习总结 2. 书面作业 Q1.注释的应用:使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) Q2.面向对象设计(大作业1-非常重要) 2.1 讲故事 ...
- 201521123092《java程序设计》第九周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...
- 第二部分----CSS的基础语法
PART-1 CSS的基础常识 一.什么是CSS? W3C标准中,倡导有3:其一为内容与表现分离,其二为内容与行为分离,其三为内容结构的语义化.其倡导中第一条的"表现"指的便可以说 ...
- 子元素设定margin值会影响父元素
有些情况下,我们设定父元素下的子元素margin值时,父元素会被影响. 这是个常见问题,而且只在标准浏览器下 (FirfFox.Chrome.Opera.Sarfi)产生问题,IE下反而表现良好. 例 ...
- [Android FrameWork 6.0源码学习] View的重绘过程之Draw
View绘制的三部曲,测量,布局,绘画现在我们分析绘画部分测量和布局 在前两篇文章中已经分析过了.不了解的可以去我的博客里找一下 下面进入正题,开始分析调用以及函数原理 private void pe ...
- Linux Ubuntu jdk(环境变量)配置
一.下载JDK - jdk版本建议是gz形式的,rpm是RedHat里面的命令,所以下载rpm格式的时候回遇到问题 二. 打开虚拟机,创建目录 1 创建目录 #mkdir home 2 转到该目录下 ...
- SparkStreming之updateStateByKey
正文 上一篇简单的写了一个socketTextStream的demo,这个问题就是每一次不能将之前和之后的数据进行合并统一.接下来我们通过demo进行把着这个问题解决. val conf = new ...
- bootStrap事例代码
最近在学bootStrap,在慕课网中有这么一个例子-.感觉以后会用到这些代码.保存起来. <!DOCTYPE html> <html lang="zh-cn"& ...