copy模块中的copy与deepcopy的区别
前言
每空闲下来,就觉得以前写的博客很low........也许现在也很low~~~~好吧就当升级版的low吧~~~~
如果要了解copy与deepcopy的区别,就需要了解Python的存储机制;Python在赋值会在内存里开辟一个空间来存放值这就叫“内存地址”,同时会开辟一个空间来存放名字叫命名,在数据相同长度在一定范围、且数据为不可变类型时,Python的内部会有节省内存机制让几个变量名指向同一个内存地址,当然这个就不存在什么深浅拷贝了hhh~,来说说可变类型吧,一般浅拷贝是对最外层的数据进行拷贝,也就是开辟一个新的内存空间来存储,而对内层的数据进行内存地址的引用,而深拷贝则是将原数据所有数据重新存储到一个新的内存空间中。反正记住一点,在多个变量引用同一个内存地址的可变数据时,无论是对哪个变量进行修改,其余的值也会随之变化。
浅拷贝
无论多复杂的数据都只复制最外层的数据,对内层数据对象的内存地址进行引用。
import copy
list1 = ['我是第一层', ["我是第二层", ["我是第三层", ]]]
list2 = copy.copy(list1)
# 查看内存地址是否相同
print(id(list1), id(list2)) # 39613704 39613768
# 这时你发现哇,内存地址不一样是不是代表着这两个数据就完全没关系了,那我们修改其中一个试试
list1.append("改改数据")
print(list1) # ['我是第一层', ['我是第二层', ['我是第三层']], '改改数据']
print(list2) # ['我是第一层', ['我是第二层', ['我是第三层']]]
# 你会发现还是不同,我们想想前言说的,浅拷贝是对最外层的数据创建一个新的内存空间来存储,而对内层的内存地址进行引用
list1[1].append("改改数据")
print(list1) # ['我是第一层', ['我是第二层', ['我是第三层'], '改改数据'], '改改数据']
print(list2) # ['我是第一层', ['我是第二层', ['我是第三层'], '改改数据']]
# 果然,在修改list1第二层数据的时候,list2也随之改变了,由此可以验证我们说的是正确的
深拷贝
完全复制原来变量的所有数据,在内存中开辟一个新的内存地址。
.....我就不写例子了
list2 = copy.deepcopy(list1)
list1无论如何修改,对list2都无法照成任何影响
copy模块中的copy与deepcopy的区别的更多相关文章
- node.js模块中exports和module.exports的区别
Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. CommonJS规范规定 ...
- nodejs模块中exports和module.exports的区别
通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ ,这些核心模块被编译成二进制文件,可以require('模块名')去获取:核心 ...
- python之requests模块中的params和data的区别
params的时候之间接把参数加到url后面,只在get请求时使用: import requests url='https://api.ireaderm.net/account/charge/info ...
- python学习之copy模块
Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.2. copy.deepc ...
- Python:序列的copy() 方法和 copy 模块
转于:Python中copy和deepcopy中的区别 博主:assan 一.序列中的 copy() 方法 # 此方法为浅度复制:复制的数会随着被复制数的嵌套序列的元素的改变而改变: # 功能:将一个 ...
- python中 =、copy、deepcopy的差别
python2中,需要import copy模块 python3中,直接可以使用copy()方法,但deepcopy()还是需要导入copy模块 下面以python2为例: 对于"=&quo ...
- 从python中copy与deepcopy的区别看python引用
讨论copy与deepcopy的区别这个问题要先搞清楚python中的引用.python的内存管理. python中的一切事物皆为对象,并且规定参数的传递都是对象的引用.可能这样说听起来比较难懂,对比 ...
- Python中=、copy、deepcopy
一.Python中的"=" a = 1 b = 1 c = a print(id(a)) print(id(b)) print(id(c)) #输出为 14070784103734 ...
- Python之copy模块
概念 官方解释:Python中的赋值语句不复制对象,它们在目标和对象之间建立索引.对于可变项目或可变项目的集合,有时需要一个副本,以便可以更改一个副本而不更改其他副本.该模块提供通用的浅层和深层cop ...
随机推荐
- Servlet(四)----Request
## Request 1.request对象和response对象的原理 1.request和response对象是由服务器创建的.我们来使用他们. 2.request对象是来获取请求消息,resp ...
- AJAX完全解读
本文讲AJAX相关的知识全部讲解了一遍.要想入门,选择这篇文章完全够用 本文的知识图谱: AJAX的用处: 在没有AJAX之前,每次从服务端获取数据都要刷新页面(也就是同步请求),这十分的麻烦.比 ...
- js原生模拟new 关键字
function newOperator(ctor){ if(typeof ctor !== 'function'){ throw 'newOperator function the first pa ...
- LeetCode#1047-Remove All Adjacent Duplicates In String-删除字符串中的所有相邻重复项
一.题目 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们. 在 S 上反复执行重复项删除操作,直到无法继续删除. 在完成所有重复项删除操作后返回最终的字符串.答案 ...
- flask操作数据库 以及 建表
创建迁移仓库 首先,安装Flask-Migrate: pip install flask-migrate 将app项目注册,便于使用orm操作 from flask_sqlalchemy import ...
- ASP.NET Core单文件和多文件上传并保存到服务端
前言: 在我们日常开发中,关于图片,视频,音频,文档等相关文件上传并保存到服务端中是非常常见的一个功能,今天主要是把自己在开发中常用的两种方式记录下来方便一下直接使用,并且希望能够帮助到有需要的同学! ...
- 关于k12领域Lucene.net+pangu搜索引擎设计开发的一些回顾
在中国最大的教育资源门户网站两年期间, 黄药师负责学科网搜吧的设计与开发…正好赶上了公司飞速发展的阶段.. 作为专注于k12领域内容与服务的互联网公司的一员,同时整个公司又在积极提升用户体验的氛围中, ...
- STL之list函数解析
STL之list函数解析 list是C++标准模版库(STL,Standard Template Library)中的部分内容.实际上,list容器就是一个双向链表,可以高效地进行插入删除元素. 使用 ...
- Failed to introspect Class [XXX] from ClassLoader [ParallelWebap报错
今天写了一个Controller,结果刚刚本地跑就给了一个惊喜 org.springframework.beans.factory.BeanCreationException: Error creat ...
- eolinker测试增强
地址:https://www.eolinker.com Chrome: https://chrome.google.com/webstore/detail/eolinker/mdbgchaihbacj ...