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 ...
随机推荐
- C 2013笔试题
1.把整数分解成素数 如90=2*3*3*5 [见2015年] 方法一: int main() { int n, i=2; printf("\nInput:"); scanf(&q ...
- JDBC(四)----数据库连接池
## 数据库连接池 * 概念:其实就是一个容器(集合) * 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后会将连接对象归还给容 ...
- [bfs,深度记录] East Central North America Regional Contest 2016 (ECNA 2016) D Lost in Translation
Problem D Lost in Translation The word is out that you’ve just finished writing a book entitled How ...
- 10.map
map Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现 . map是一种无序的基于key-value的数据结构,Go语言中的map是引用类型,必须初始化才能使用. map定义 ...
- HDU - 1160 最长上升子序列以及记录路径
题意:第一列,给出老鼠的重量,第二列,给出老鼠的速度,要证明老鼠的重量越大,速度越小,给出最多老鼠的数量,并说明第几只. 思路:先将老鼠按照重量从大到小排序,然后速度是从小到大,求最长上升子序列,学习 ...
- Swagger2 初始用
1.结合Spring-Boot 引入 pom 依赖 <dependency> <groupId>io.springfox</groupId> <artifa ...
- Flutter 实现整个App变为灰色
在Flutter中实现整个App变为灰色是非常简单的,只需要在最外层的控件上包裹ColorFiltered,用法如下: @override Widget build(BuildContext cont ...
- coding++:Spring Boot全局事务解释及使用(一)
Spring 事务的入口: TxAdviceBeanDefinitionParser 解释 <tx:advice/> 这里将解析tx的配置. @Override protected Cla ...
- lvs + keepalived + gninx 高性能负载均衡
1,nginx 作为负载均衡器,在应用层实现了负载均衡和反向代理,在分布式集群中,能够有效的去处理大数据量,高访问的应用.但是,如果nginx 服务挂了怎么办? 为此,可以实现两台nginx或者多台n ...
- 思考设计SQL优化方案
一.优化的哲学 注:优化有风险,涉足需谨慎 1.优化可能带来的问题? 优化不总是对一个单纯的环境进行,还很可能是一个复杂的已投产的系统: 优化手段本来就有很大的风险,只不过你没能力意识到和预见到: 任 ...