拷贝Python对象、浅拷贝、深拷贝
浅拷贝和深拷贝在C++中出现和使用的较多,python也有相应的用法。
test1 = ['a','c','b','d','f']
print id(test1)
test2 = test1
print id(test2)
首先是创建了一个列表对象,并将这个对象的引用赋值给test1这个变量,在test2=test1赋值语句中,python没有拷贝这个对象,只是拷贝了这个对象的引用,所以二者有相同id。
现在创创建一个通用档案,名为person,然后进行拷贝,一种拷贝方式采用的是切片操作,另一种方式采用工厂方法。
person = ['name',['saving',1000.0]]
hubby = person[:] #切片方式进行拷贝
wifey = list(person) #使用工厂函数
print [id(x) for x in person,hubby,wifey]
为他们创建了初始有¥100的个人存款账户,用户名改为定制的名字。但是当hubby取走¥50后,他的行为影响到了wifey的账户,虽然进行了分开的拷贝操作(希望的是每人都有一个自己独立的账号,而不是一个公用的账号)为什么会出现这样的情况呢?
hubby[0] = 'jon'
wifey[0] = 'jane'
print hubby,wifey
原因是仅仅做了一个浅拷贝。对一个对象进行浅拷贝其实是创建了一个类型跟原来对象一样,其内容是原来对象元素的引用,换句话说,这个拷贝的对象本身是新的,但是他的内容不是。序列类型的浅拷贝是默认类型拷贝,可以以一下几种方式实施(1)完全切片操作[:];(2)利用工厂函数,比如list(),dict()等;(3)使用copy模块的copy()函数。
那为什么名字被修改时,另一个人的名字没有收到影响呢?这是因为在这两个列表的两个对象中,第一个对象时不可变对象(字符串类型),而第2个对象时可变的(列表)。正因为如此,当进行浅拷贝时,字符串被显示的拷贝,并新创建了一个字符串对象,而列表元素只是把它的引用复制了一下。从而改变名字没有任何问题,但是更改银行账户的任何信息都会引发问题。
print [id(x) for x in hubby]
print [id(x) for x in wifey]
由于hubby和wifey的银行账号是同一个id,这也就是为什么修改一个会影响到另一个的原因。
现在想创建一个个联合账户,这就是一个很不错的方案。那如果想创建两个分离的账户呢,需要得到一个完全拷贝或者深拷贝--传建一个新的容器对象,包含原有对象元素(引用)全新拷贝的引用---需要copy.deepcopy()函数
person = ['name',['saving',1000.0]]
hubby = person[:]
import copy
wifey = copy.deepcopy(person)
print [id(x) for x in person,hubby,wifey]
hubby[0] = 'jon'
wifey[0] = 'jane'
print hubby,wifeyhubby[1][1] = 2000.0
print hubby,wifey
print [id(x) for x in hubby,wifey]
关于拷贝的几点说明:
1、非容器类型(比如数字、字符串和其它“原子”类型的对象,比如代码、类型和xrange对象等)没有被拷贝一说,浅拷贝是用完全切片操作来完成的
2、如果元组变量只包含原子类型对象,对它的深拷贝将不会进行。如果把账户信息改成元组类型,那即是按照要求使用深拷贝操作也只能得到一个浅拷贝
copy()进行浅拷贝,deepcopy()进行深拷贝
拷贝Python对象、浅拷贝、深拷贝相关推荐
- Python对象之深拷贝、浅拷贝
"对一个对象进行浅拷贝其实是新创建了一个类型和原来对象一样,但是内容是原来对象元素的引用.换句话说,这个拷贝的对象本身是新的,但是它的内容不是" 上面这段话摘自<Python ...
- python深拷贝一个对象_Python对象的深拷贝和浅拷贝详解
本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...
- Python天天美味(22) - 拷贝对象(深拷贝deepcopy与浅拷贝copy)
Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...
- Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
http://www.jb51.net/article/15714.htm 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝 ...
- Python基础:对象的深拷贝和浅拷贝的区别
Python基础:对象的深拷贝和浅拷贝的区别 1 变量与对象 2 不可变对象与可变对象 3 直接赋值 4 浅拷贝 5 深拷贝 参考文献 1 变量与对象 对象:内存中存储数据的实体,有明确的类型.在Py ...
- python深浅拷贝的底层理解_理解python中的深拷贝与浅拷贝
python中浅拷贝和深拷贝的区别如下: 1. copy.copy 等价于切片[:] 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.2个列表是不同的,但是子列表指向的仍然是同一个地址 2. co ...
- Python —对象的浅拷贝和深拷贝
变量的赋值操作 只是形成两个变量,实际还是指向同一个对象. 浅拷贝 Python 拷贝一般都是浅拷贝(copy.copy).拷贝时,对象包含的子对象内容不拷贝.因此,源对象和拷贝对象会引用同一个子对象 ...
- python 实例对象 浅拷贝_python的浅拷贝和深拷贝
一.浅拷贝和深拷贝的作用简述 浅拷贝和深拷贝可以运用于不同的场景,比如一个夫妻联名账户,将账户的信息都放入一个对象中,夫妻两人的账户信息都通过这个对象拷贝而来(两人一人一个账号),但是任何一个人取出存 ...
- python 实例对象 浅拷贝_Python对象中的浅拷贝和深拷贝
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. Python中的赋值语句不会创建对象的副本,而只是给对象绑定了新的名称.对于不可变对象,这通常没什么区别. ...
最新文章
- 【转载】阿里云ECS服务器监控资源使用情况
- 面试官:你对MySQL高性能优化有什么规范建议?
- excel表格中添加combobox_Excel中两个表格对比,找出不同数据
- scm maven_在运行时访问工件的Maven和SCM版本
- 中科院教授:科技界已几乎沦为名利场...
- ML《集成学习(一)Bagging 和 Random Forest》
- python爬虫实战:《星球大战》豆瓣影评分析
- 单纯形表的matlab输出,自编MATLAB版单纯性算法 可以列出单纯形表以及其他相关数据...
- 好男人是这样爱老婆的
- 软件测试启航篇:测试的分类
- 微软ReportViewer(rdlc)发布时所需要的动态库(vs2010)
- 转载windows的网络错误问题,备需要时查看
- SCVMM 2012 R2---添加Hyper-V虚拟机
- 成都职称计算机 报几科,成都2018年7月上职称计算机考试报名事项通知
- 从GSM-GPRS-WCDMA-LTE网络结构的变化,分析话音和数据交换技术的演进过程
- Python数据结构与算法(17)---归并排序
- 网页编程入门应该首先学些什么
- Contest3410 - 2022大中小学生联合训练第五场
- ~~因果图法示例分析
- 使用Enounce MySpeed对flv加速播放
热门文章
- 洛谷P2698 [USACO12MAR]花盆Flowerpot
- mybatis入门(六)----高级映射(一对一,一对多,多对多)
- ng机器学习视频笔记(二) ——梯度下降算法解释以及求解θ
- buildroot--ubootkernelrootfs全编译工具
- mysql(connector/ODBC)
- 怎样在android平台上使用第三方jar包
- 访问备份数据寄存器时,需要打开BKP时钟吗?
- 在IAR下如何查看工程的堆栈(STM32)
- Git 操作简单总结:廖雪峰教程
- C++ Primer 5th笔记(1)chapter 1