python中浅拷贝和深拷贝分析
首先,我们知道Python3中,有6个标准的数据类型,他们又分为可以变和不可变。
不可变:Number(数字)、String(字符串)、Tuple(元组)。
可以变:List(列表)、Dictionary(字典)、Set(集合)。
一.浅拷贝
a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)
浅拷贝后,改变原始对象中为可变类型的元素的值,会同时影响拷贝对象;改变原始对象中为不可变类型的元素的值,不会响拷贝对象。
- #定义一个列表,第一个元素是可变类型
>>> A = [[1,2],'fei',90]
#浅拷贝- >>> B = copy.copy(A)
#对象地址是否相同- >>> A is B
- False
#第一个元素地址是否相同- >>> A[0] is B[0]
- True
#第二个元素地址是否相同- >>> A[1] is B[1]
- True
#改变第一个可变类型的值,查看复制对象变化- >>> A[0][0] = 2
- >>> A
- [[2, 2], 'fei', 90]
#复制对象也跟着改变了- >>> B
- [[2, 2], 'fei', 90]
#改变第二个不可变类型的值,查看复制对象变化- >>> A[1] = 'anne'
- >>> A
- [[2, 2], 'anne', 90]
#复制对象没有改变- >>> B
- [[2, 2], 'fei', 90]
二.深拷贝
a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
深拷贝,除了顶层拷贝,还对子元素也进行了拷贝。
经过深拷贝后,原始对象和拷贝对象所有的可变元素地址都没有相同的了。
- #深拷贝
>>> C = copy.deepcopy(A)
#对象地址是否相同- >>> A is C
- False
#第一个元素地址是否相同- >>> A[0] is C[0]
- False
#第二个元素地址是否相同- >>> A[1] is C[1]
- True
#改变第一个元素,查看复制元素变化- >>> A[0][0] = 2
- >>> A
- [[2, 2], 'fei', 90]
#复制元素不变,对复制元素没影响- >>> C
- [[1, 2], 'fei', 90]
- #改变第二个元素,查看复制元素变化
- >>> A[1] = 'Anne' >>> A
[[2, 2], 'Anne', 90]
- #复制元素不变,对复制元素没影响
- >>> C
[[1, 2], 'fei', 90]
在这里看到一个让我困惑的问题,A is B
三.赋值引用
a 和 b 都指向同一个对象
- #赋值引用
- >>> A = [[1,2],'fei',90]
- >>> D = A
- #对象地址是否相同
- >>> A is D
- True
- #第一个元素地址是否相同
- >>> A[0] is D[0]
- True
- #第二个元素地址是否相同
- >>> A[1] is D[1]
- True
- #改变A中第一个元素,查看是否影响D
- >>> A[0][0] = 2
- >>> A
- [[2, 2], 'fei', 90]
- #D中第一个元素也跟着改变
- >>> D
- [[2, 2], 'fei', 90]
- #改变D中第二个元素,查看是否影响A
- >>> D[1] = 'anne'
- #A中第二个元素也改变了
- >>> A
- [[2, 2], 'anne', 90]
- >>> D
- [[2, 2], 'anne', 90]
- >>>
python中浅拷贝和深拷贝分析的更多相关文章
- Python中浅拷贝和深拷贝的区别总结与理解
单层浅拷贝 import copy a = 1 # 不可变数据类型 copy_a = copy.copy(a) print(id(a),id(copy_a)) # 内存地址相同 a = [1,2] # ...
- python中浅拷贝和深拷贝的区别
浅拷贝 可变类型浅拷贝copy函数就是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象可变类型:a = [1, 2, 3] b = [11, 2 ...
- 深度解析:python之浅拷贝与深拷贝
深度解析python之浅拷贝与深拷贝 本文包括知识点: 1.copy与deepcopy 2.可变类型与不可变类型 1.copy与deepcopy 在日常python编码过程中,经常会遇见变量的赋值.这 ...
- Python中复制、深拷贝和浅拷贝的区别
深拷贝定义(deepcopy) 在Python中,由于一切皆对象,所以任何变量都可以被引用,也即可以被赋值给任何变量.但是在Python中,给变量赋值,是区分的,一般情况下,Python中的变量赋值都 ...
- python中赋值,深拷贝,浅拷贝区别
这三种 的区别就是 复制的变量 是否是原变量的引用. 赋值:只是原变量的引用. 浅拷贝和深拷贝的区别 需要通过 子元素 区分 浅拷贝:子元素的 引用相同 深拷贝:所以引用都不相同,完全复制一份 这三种 ...
- python的浅拷贝和深拷贝
python对象有两种拷贝的形式:浅拷贝和深拷贝. 在<python核心编程>中看到对这两种拷贝的分析,觉得十分收益,所以记录在此. id()方法:id()方法可以查看某个对象的ID,类似 ...
- python之浅拷贝和深拷贝
1.浅拷贝 1>赋值:从下面的例子我们可以看到赋值之后新变量的内存地址并没有发生任何变化,实际上python中的赋值操作不会开辟新的内存空间,它只是复制了新对象的引用,也就是说除了b这个名字以外 ...
- python:浅拷贝与深拷贝
1,“相等”与“相同” 我们先赋值三个变量a, b, c: a = [1, 2, [1, 2]] b = [1, 2, [1, 2]] c = a 判断一下‘相等’: a == b 返回 True ...
- Python的浅拷贝与深拷贝
定义: =号浅拷贝:在Python中对象的赋值其实就是对象的引用.copy了之后两个仍然是同一个东西.那么他们内部的元素自然也是一样的,对其中一个进行修改,另一个也会跟着变> copy()浅拷贝 ...
随机推荐
- 1、Kfaka 部署
一.使用Kfaka自带的zookeeper服务. 1.下载Kafka,下载地址: http://kafka.apache.org/downloads 2.区分Kfaka版本: Scala 2.12 - ...
- [Codeforces1137F]Matches Are Not a Child's Play——LCT+树状数组
题目链接: [Codeforces1137F]Matches Are Not a Child's Play 题目大意: 我们定义一棵树的删除序列为:每一次将树中编号最小的叶子删掉,将该节点编号加入到当 ...
- vue.js 中this.$router.push()的使用
在vue项目中,跳转可以用router-link直接跳到某个页面 因为有时候会需要做一些判断等情况,所以要用到 this.$router.push() 因为外链跳转根本就不在router的设计考虑范围 ...
- 如何在虚拟机中安装kali linux
整理笔记,把以前印象笔记中记录的一些东西翻出来,想想发个随笔吧. 第一步在官网下载kali linux的镜像. 网址:https://www.kali.org/downloads/ (我的电脑是64位 ...
- spring boot + vue 前后分离实现登录功能(一)
使用webpack 打包初始化项目 vue init webpack book-vue 进入工程目录 cd hello-vue 安装 vue-router npm install vue-router ...
- nginx中获取真实的客户端访问IP
date : 2019-06-28 16:54:50 author: headsen chen notice: 个人原创 1,必需要先搞清楚的基本概念 1.1 什么是remote_addr ...
- Flutter 中使用Future消除Callback Hell
/先分别定义各个异步任务 Future<String> login(String userName, String pwd){ ... //用户登录 }; Future<String ...
- 阶段5 3.微服务项目【学成在线】_day18 用户授权_18-微服务之间认证-需求分析
4.1 需求分析 前边章节已经实现了用户携带身份令牌和JWT令牌访问微服务,微服务获取jwt并完成授权. 当微服务访问微服务,此时如果没有携带JWT则微服务会在授权时报错. 测试课程预览: 1.将课程 ...
- javascript模拟生成uuid
function guid() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r ...
- PHP实现简单留言板
最近学习了下PHP基础,这里做一个简单的留言板,算是对PHP和MySQL的使用做一个整体的练习吧,不遇到问题总感觉学不到东西. 截图如下: 总结: 1>数据库的简单操作,数据库的增删改查: 2. ...