Python中的浅拷贝 深拷贝
浅拷贝只拷贝父对象,子对象的地址空间不改变,包括下面三种:
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中的浅拷贝 深拷贝的更多相关文章
- python中赋值-浅拷贝-深拷贝之间的关系
赋值: 变量的引用,没有拷贝空间 对象之间赋值本质上 是对象之间的引用传递而已.也就是多个对象指向同一个数据空间. 拷贝的对象分两种类型: . 拷贝可变类型 浅拷贝: 只拷贝第一层数据,不关心里面的第 ...
- python开发_copy(浅拷贝|深拷贝)_博主推荐
在python中,有着深拷贝和浅拷贝,即copy模块 下面我们就来聊一下: 运行效果: ================================================== 代码部分: ...
- Python中复制、深拷贝和浅拷贝的区别
深拷贝定义(deepcopy) 在Python中,由于一切皆对象,所以任何变量都可以被引用,也即可以被赋值给任何变量.但是在Python中,给变量赋值,是区分的,一般情况下,Python中的变量赋值都 ...
- python中的浅拷贝与赋值不同
Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...
- python中的浅拷贝和深拷贝
1.赋值语句 a = 'abc' b = a print id(a) print id(b) # id(a):29283464 # id(b):29283464 通过简单的复制,我们可以看到,a b其 ...
- 16.python中的浅拷贝和深拷贝
在讲什么是深浅拷贝之前,我们先来看这样一个现象: a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b
- Python中的浅拷贝与深拷贝
编者注:本文主要参考了<Python核心编程(第二版)> 以下都是参考资料后,我自己的理解,如有错误希望大家不吝赐教. 大家有没有遇到这样一种情况,对象赋值后,对其中一个变量进行修改,另外 ...
- 深入理解Python中赋值、深拷贝(deepcopy)、浅拷贝(copy)
赋值 python跟java中的变量本质是不一样的,Python的变量实质上是一个指针(int型或str型),而java的变量是一个可操作的存储空间. a = 123b = a print(id(a) ...
- (转+原)python中的浅拷贝和深拷贝
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6069722.html 原网址: http://blog.csdn.net/sunshine_in_mo ...
随机推荐
- Vue#组件
组件: 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能. 使用: ...
- CF 337D 求圆交
题目链接:http://codeforces.com/problemset/problem/337/D 题意:就是一棵树上,有一些点被来自东方的神秘力量影响的,力量影响范围是d,为可能的力量源有几个. ...
- Objective-C 中self.与_访问方式的区别
Objective-C中属性self.a与_a访问的区别: 在OC中我们可以通过指令@property定义属性. OC对属性封装了许多方法,同时也会自动实现一些方法,相比实例变量,感觉更加面向对象些. ...
- Rotate Image
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...
- 【原】iOS学习之应用程序的启动原理
最近看视频了解了一下应用程序的启动原理,这里就做一个博客和大家分享一下,相互讨论,如果有什么补充或不同的意见可以提出来! 1.程序入口 众所周知,一个应用程序的入口一般是一个 main 函数,iOS也 ...
- Android入门(八):使用RadioGroup 和RadioButton组件建立单选清单
这一章,我们学习RadioGroup 和RadioButton组件,我们新建一个项目,编码过程与前几章的项目类似. 1.建立字符串资源文件strings.xml: <resources> ...
- EntityFrame CodeFirst 自动生成表
来源:http://msdn.microsoft.com/zh-cn/data/jj193542 本视频和分步演练介绍通过 Code First 开发建立新数据库.这个方案包括建立不存在的数据库(Co ...
- Java_动态重新加载Class机制
Java动态重新加载Class 项目中使用到了动态重新加载Class的机制,作用是让一些代码上线之前可以在线上环境测试一下,当然,这是非常不好的测试机制,我刚来的时候也为这种机制感到惊讶—怎么可以在线 ...
- 使用BigDecimal进行精确运算以及格式化输出数字
一.引言 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供 ...
- linux自用命令
文件操作权限设置: chmod 777 文件名/文件夹名 拥有所有权限 http://www_xpc8_com/ chmod 755 文件名/文件夹名 属主有所有权限, ...