浅拷贝和深拷贝在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对象、浅拷贝、深拷贝相关推荐

  1. Python对象之深拷贝、浅拷贝

    "对一个对象进行浅拷贝其实是新创建了一个类型和原来对象一样,但是内容是原来对象元素的引用.换句话说,这个拷贝的对象本身是新的,但是它的内容不是" 上面这段话摘自<Python ...

  2. python深拷贝一个对象_Python对象的深拷贝和浅拷贝详解

    本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...

  3. Python天天美味(22) - 拷贝对象(深拷贝deepcopy与浅拷贝copy)

    Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...

  4. Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)

    http://www.jb51.net/article/15714.htm 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝 ...

  5. Python基础:对象的深拷贝和浅拷贝的区别

    Python基础:对象的深拷贝和浅拷贝的区别 1 变量与对象 2 不可变对象与可变对象 3 直接赋值 4 浅拷贝 5 深拷贝 参考文献 1 变量与对象 对象:内存中存储数据的实体,有明确的类型.在Py ...

  6. python深浅拷贝的底层理解_理解python中的深拷贝与浅拷贝

    python中浅拷贝和深拷贝的区别如下: 1. copy.copy 等价于切片[:]  浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.2个列表是不同的,但是子列表指向的仍然是同一个地址 2. co ...

  7. Python —对象的浅拷贝和深拷贝

    变量的赋值操作 只是形成两个变量,实际还是指向同一个对象. 浅拷贝 Python 拷贝一般都是浅拷贝(copy.copy).拷贝时,对象包含的子对象内容不拷贝.因此,源对象和拷贝对象会引用同一个子对象 ...

  8. python 实例对象 浅拷贝_python的浅拷贝和深拷贝

    一.浅拷贝和深拷贝的作用简述 浅拷贝和深拷贝可以运用于不同的场景,比如一个夫妻联名账户,将账户的信息都放入一个对象中,夫妻两人的账户信息都通过这个对象拷贝而来(两人一人一个账号),但是任何一个人取出存 ...

  9. python 实例对象 浅拷贝_Python对象中的浅拷贝和深拷贝

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. Python中的赋值语句不会创建对象的副本,而只是给对象绑定了新的名称.对于不可变对象,这通常没什么区别. ...

最新文章

  1. 【转载】阿里云ECS服务器监控资源使用情况
  2. 面试官:你对MySQL高性能优化有什么规范建议?
  3. excel表格中添加combobox_Excel中两个表格对比,找出不同数据
  4. scm maven_在运行时访问工件的Maven和SCM版本
  5. 中科院教授:科技界已几乎沦为名利场...
  6. ML《集成学习(一)Bagging 和 Random Forest》
  7. python爬虫实战:《星球大战》豆瓣影评分析
  8. 单纯形表的matlab输出,自编MATLAB版单纯性算法 可以列出单纯形表以及其他相关数据...
  9. 好男人是这样爱老婆的
  10. 软件测试启航篇:测试的分类
  11. 微软ReportViewer(rdlc)发布时所需要的动态库(vs2010)
  12. 转载windows的网络错误问题,备需要时查看
  13. SCVMM 2012 R2---添加Hyper-V虚拟机
  14. 成都职称计算机 报几科,成都2018年7月上职称计算机考试报名事项通知
  15. 从GSM-GPRS-WCDMA-LTE网络结构的变化,分析话音和数据交换技术的演进过程
  16. Python数据结构与算法(17)---归并排序
  17. 网页编程入门应该首先学些什么
  18. Contest3410 - 2022大中小学生联合训练第五场
  19. ~~因果图法示例分析
  20. 使用Enounce MySpeed对flv加速播放

热门文章

  1. 洛谷P2698 [USACO12MAR]花盆Flowerpot
  2. mybatis入门(六)----高级映射(一对一,一对多,多对多)
  3. ng机器学习视频笔记(二) ——梯度下降算法解释以及求解θ
  4. buildroot--ubootkernelrootfs全编译工具
  5. mysql(connector/ODBC)
  6. 怎样在android平台上使用第三方jar包
  7. 访问备份数据寄存器时,需要打开BKP时钟吗?
  8. 在IAR下如何查看工程的堆栈(STM32)
  9. Git 操作简单总结:廖雪峰教程
  10. C++ Primer 5th笔记(1)chapter 1