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 ...
随机推荐
- 移动APP项目研发流程及版本规划(转)
一个移动APP项目研发规模可大可小,但都离不开以下几个成员:产品经理.ui设计师.前端开发.后端开发.测试等.如何合理安排项目成员工作.确保项目顺利进行呢?一个清晰合理的项目研发流程控制很重要. 项目 ...
- 300ms延时
具体参考:http://www.jianshu.com/p/6e2b68a93c88 一,简单粗暴型:禁用缩放 <meta name="viewport" content=& ...
- Hibernate关联关系的映射
实体之间的关系 实体之间有三种关系 一对多:一个用户,生成多个订单,每一个订单只能属于一个用户 建表原则:在多的一方创建一个字段,作为外键,指向一的一方的主键 多对多:一个学生可以选择多门课程,一个课 ...
- Linux 安装tomcat
安装命令: yum install tomcat 安装完后默认: 安装路径: /usr/share/tomcat 执行命令(启动,停止, 重启): /etc/rc.d/init.d/tomcat 配置 ...
- spring异常-aoperror at :0 formal unbound in pointcut
八月 17, 2016 10:15:21 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRe ...
- 【转】Java内存管理:深入Java内存区域
转自:http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html 本文引用自:深入理解Java虚拟机的第2章内容 Java与C++之间有一 ...
- 2016 ECJTU - STL
1.ECJTU-STL重挂 STL 2.总结:学长出的题,本来还想ak的,结果又被虐了... 3.标程和数据:http://pan.baidu.com/s/1qYzXY2K 01 水 02 水 ...
- 基于Spring + Spring MVC + Mybatis + shiro 高性能web构建
一直想写这篇文章,前段时间 痴迷于JavaScript.NodeJs.AngularJS,做了大量的研究,对前后端交互有了更深层次的认识. 今天抽个时间写这篇文章,我有预感,这将是一篇很详细的文章,详 ...
- About_类与对象
所谓类,就是把具有相同行为,特征的归为一类: 1)什么是面向对象: 起初,“面向对象”是专指在程序设计中采用封装.继承.抽象等设计方法.可是,这个定义显然不能再适合现在情况.面向对象的思想已经涉及到软 ...
- Vue.js组件之联动下拉框
Html代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...