浅拷贝只拷贝父对象,子对象的地址空间不改变,包括下面三种:

1. copy

从下面的例子可以看出对象c从a拷贝,当对象a增加一个列表元素之后,c对象没有改变, 而当对象a中的子列表改变时,对象c的子列表元素同样也改变了。

可以理解为浅拷贝只改变父对象的地址空间,而子对象的地址空间不改变,这样子对象自然会受到影响,而父对象不受影响。

>>> a=[1,2,3,['a','b','c']]
>>> b=a
>>> import copy
>>> c=copy.copy(a)
>>> a.append(4)
>>> b
[1, 2, 3, ['a', 'b', 'c'], 4]
>>> c
[1, 2, 3, ['a', 'b', 'c']]
>>> a[3].append('d')
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 4]
>>> b
[1, 2, 3, ['a', 'b', 'c', 'd'], 4]
>>> c
[1, 2, 3, ['a', 'b', 'c', 'd']]
>>>

2. list

>>> a
[100, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> e=list(a)
>>> e
[100, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> a
[100, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> a[0]=200
>>> e
[100, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> a
[200, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> a[3].remove('d')
>>> a
[200, 2, 3, ['a', 'b', 'c'], 4, 5]
>>> e
[100, 2, 3, ['a', 'b', 'c'], 4, 5]

>>> a[3]=300
>>> a
[200, 2, 3, 300, 4, 5]
>>> e
[100, 2, 3, ['a', 'b', 'c'], 4, 5]

3. 切片

>>> e=a[:]
>>> e
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> e.append(8)
>>> e
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5, 8]
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> a[3].append('p')
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd', 'p'], 4, 5]
>>> e
[1, 2, 3, ['a', 'b', 'c', 'd', 'p'], 4, 5, 8]

深拷贝父对象,子对象的地址空间都改变,这样目标对象跟原始对象无论哪个改变都不会互相影响;

>>> d=copy.deepcopy(a)
>>> d
[1, 2, 3, ['a', 'b', 'c', 'd'], 4]
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 4]
>>> a.append(5)
>>> d
[1, 2, 3, ['a', 'b', 'c', 'd'], 4]
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> d[3].append('e')
>>> d
[1, 2, 3, ['a', 'b', 'c', 'd', 'e'], 4]
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]
>>> b
[1, 2, 3, ['a', 'b', 'c', 'd'], 4, 5]

总结:

e=a  相同标签引用同一个地址空间,互相影响;

e=a[:] 或者 e=list(a) 或者 e=copy.copy(a) 均为浅拷贝,父对象互不影响,但是子对象都是引用同一个地址空间;

e=copy.deepcopy(a) 深拷贝,父对象跟子对象全部创建新的地址空间,父对象跟子对象任何元素改变都互不影响;

Python中的浅拷贝 深拷贝的更多相关文章

  1. python中赋值-浅拷贝-深拷贝之间的关系

    赋值: 变量的引用,没有拷贝空间 对象之间赋值本质上 是对象之间的引用传递而已.也就是多个对象指向同一个数据空间. 拷贝的对象分两种类型: . 拷贝可变类型 浅拷贝: 只拷贝第一层数据,不关心里面的第 ...

  2. python开发_copy(浅拷贝|深拷贝)_博主推荐

    在python中,有着深拷贝和浅拷贝,即copy模块 下面我们就来聊一下: 运行效果: ================================================== 代码部分: ...

  3. Python中复制、深拷贝和浅拷贝的区别

    深拷贝定义(deepcopy) 在Python中,由于一切皆对象,所以任何变量都可以被引用,也即可以被赋值给任何变量.但是在Python中,给变量赋值,是区分的,一般情况下,Python中的变量赋值都 ...

  4. python中的浅拷贝与赋值不同

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

  5. python中的浅拷贝和深拷贝

    1.赋值语句 a = 'abc' b = a print id(a) print id(b) # id(a):29283464 # id(b):29283464 通过简单的复制,我们可以看到,a b其 ...

  6. 16.python中的浅拷贝和深拷贝

    在讲什么是深浅拷贝之前,我们先来看这样一个现象: a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b

  7. Python中的浅拷贝与深拷贝

    编者注:本文主要参考了<Python核心编程(第二版)> 以下都是参考资料后,我自己的理解,如有错误希望大家不吝赐教. 大家有没有遇到这样一种情况,对象赋值后,对其中一个变量进行修改,另外 ...

  8. 深入理解Python中赋值、深拷贝(deepcopy)、浅拷贝(copy)

    赋值 python跟java中的变量本质是不一样的,Python的变量实质上是一个指针(int型或str型),而java的变量是一个可操作的存储空间. a = 123b = a print(id(a) ...

  9. (转+原)python中的浅拷贝和深拷贝

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6069722.html 原网址: http://blog.csdn.net/sunshine_in_mo ...

随机推荐

  1. 移动APP项目研发流程及版本规划(转)

    一个移动APP项目研发规模可大可小,但都离不开以下几个成员:产品经理.ui设计师.前端开发.后端开发.测试等.如何合理安排项目成员工作.确保项目顺利进行呢?一个清晰合理的项目研发流程控制很重要. 项目 ...

  2. 300ms延时

    具体参考:http://www.jianshu.com/p/6e2b68a93c88 一,简单粗暴型:禁用缩放 <meta name="viewport" content=& ...

  3. Hibernate关联关系的映射

    实体之间的关系 实体之间有三种关系 一对多:一个用户,生成多个订单,每一个订单只能属于一个用户 建表原则:在多的一方创建一个字段,作为外键,指向一的一方的主键 多对多:一个学生可以选择多门课程,一个课 ...

  4. Linux 安装tomcat

    安装命令: yum install tomcat 安装完后默认: 安装路径: /usr/share/tomcat 执行命令(启动,停止, 重启): /etc/rc.d/init.d/tomcat 配置 ...

  5. spring异常-aoperror at :0 formal unbound in pointcut

    八月 17, 2016 10:15:21 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRe ...

  6. 【转】Java内存管理:深入Java内存区域

    转自:http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html 本文引用自:深入理解Java虚拟机的第2章内容 Java与C++之间有一 ...

  7. 2016 ECJTU - STL

    1.ECJTU-STL重挂 STL 2.总结:学长出的题,本来还想ak的,结果又被虐了... 3.标程和数据:http://pan.baidu.com/s/1qYzXY2K 01    水 02  水 ...

  8. 基于Spring + Spring MVC + Mybatis + shiro 高性能web构建

    一直想写这篇文章,前段时间 痴迷于JavaScript.NodeJs.AngularJS,做了大量的研究,对前后端交互有了更深层次的认识. 今天抽个时间写这篇文章,我有预感,这将是一篇很详细的文章,详 ...

  9. About_类与对象

    所谓类,就是把具有相同行为,特征的归为一类: 1)什么是面向对象: 起初,“面向对象”是专指在程序设计中采用封装.继承.抽象等设计方法.可是,这个定义显然不能再适合现在情况.面向对象的思想已经涉及到软 ...

  10. Vue.js组件之联动下拉框

    Html代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...