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

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. Vue#组件

    组件: 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能. 使用: ...

  2. CF 337D 求圆交

    题目链接:http://codeforces.com/problemset/problem/337/D 题意:就是一棵树上,有一些点被来自东方的神秘力量影响的,力量影响范围是d,为可能的力量源有几个. ...

  3. Objective-C 中self.与_访问方式的区别

    Objective-C中属性self.a与_a访问的区别: 在OC中我们可以通过指令@property定义属性. OC对属性封装了许多方法,同时也会自动实现一些方法,相比实例变量,感觉更加面向对象些. ...

  4. Rotate Image

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...

  5. 【原】iOS学习之应用程序的启动原理

    最近看视频了解了一下应用程序的启动原理,这里就做一个博客和大家分享一下,相互讨论,如果有什么补充或不同的意见可以提出来! 1.程序入口 众所周知,一个应用程序的入口一般是一个 main 函数,iOS也 ...

  6. Android入门(八):使用RadioGroup 和RadioButton组件建立单选清单

    这一章,我们学习RadioGroup 和RadioButton组件,我们新建一个项目,编码过程与前几章的项目类似. 1.建立字符串资源文件strings.xml: <resources> ...

  7. EntityFrame CodeFirst 自动生成表

    来源:http://msdn.microsoft.com/zh-cn/data/jj193542 本视频和分步演练介绍通过 Code First 开发建立新数据库.这个方案包括建立不存在的数据库(Co ...

  8. Java_动态重新加载Class机制

    Java动态重新加载Class 项目中使用到了动态重新加载Class的机制,作用是让一些代码上线之前可以在线上环境测试一下,当然,这是非常不好的测试机制,我刚来的时候也为这种机制感到惊讶—怎么可以在线 ...

  9. 使用BigDecimal进行精确运算以及格式化输出数字

    一.引言    借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供 ...

  10. linux自用命令

    文件操作权限设置: chmod 777 文件名/文件夹名         拥有所有权限 http://www_xpc8_com/ chmod 755 文件名/文件夹名         属主有所有权限, ...