浅谈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 ...
随机推荐
- 201521123022 《Java程序设计》 第五周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过? ...
- 201521123007《Java程序设计》第13周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...
- 201521123117 《Java程序设计》第13周学习总结
1. 本周学习总结 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 分析结果:从 ...
- 201521123019 《java程序设计》 第14周学习总结
1. 本章学习总结 2. 书面作业 Q1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 在自己建立的数据库上执行常见SQL语句(截图) ...
- 201521123008《Java程序设计》第10周学习总结
1. 本周学习总结 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 只要t ...
- sqlserver2012安装过程
第三次安装sqlserver2012 记录下安装过程,受益的人多多指教. 一.以我的系统64位为例,所以先准备安装包,从官网 https://www.microsoft.com/zh-CN/downl ...
- oracle客户端plsql设置字符集
感谢一个新朋友的到来,我帮他的过程中有好些东西都不怎么想的起来了,所以从现在起我需要记录下每一点一滴, 因为我觉得写下来的东西才不会丢,而且欢迎以后的朋友到来. 使用plsql查数据的时候有时候中文会 ...
- temp-重庆农商行二次出差
1, 住宿(远舰商务酒店) 与胡仕川一起住 1722房间, 178-27=151(返现后). 7月30日 7月31日 8月1日 8月2日 8月3日 2, 住宿(郎菲酒店)一个人住, 158 ...
- Java图的邻接矩阵实现
/** * * 图的邻接矩阵实现 * @author John * * @param <T> */ class AMWGraph<T> { private ArrayList& ...
- Linux 的集中重启的方法
linux中有下面几条命令可以实现重新启动,这些命令都需要root用户的权限: reboot shutdown -r now #立刻重启 shutdown -r #过10分钟自动重启 shutdown ...