前言

  每空闲下来,就觉得以前写的博客很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的区别的更多相关文章

  1. node.js模块中exports和module.exports的区别

    Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. CommonJS规范规定 ...

  2. nodejs模块中exports和module.exports的区别

    通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ ,这些核心模块被编译成二进制文件,可以require('模块名')去获取:核心 ...

  3. python之requests模块中的params和data的区别

    params的时候之间接把参数加到url后面,只在get请求时使用: import requests url='https://api.ireaderm.net/account/charge/info ...

  4. python学习之copy模块

    Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.2. copy.deepc ...

  5. Python:序列的copy() 方法和 copy 模块

    转于:Python中copy和deepcopy中的区别 博主:assan 一.序列中的 copy() 方法 # 此方法为浅度复制:复制的数会随着被复制数的嵌套序列的元素的改变而改变: # 功能:将一个 ...

  6. python中 =、copy、deepcopy的差别

    python2中,需要import copy模块 python3中,直接可以使用copy()方法,但deepcopy()还是需要导入copy模块 下面以python2为例: 对于"=&quo ...

  7. 从python中copy与deepcopy的区别看python引用

    讨论copy与deepcopy的区别这个问题要先搞清楚python中的引用.python的内存管理. python中的一切事物皆为对象,并且规定参数的传递都是对象的引用.可能这样说听起来比较难懂,对比 ...

  8. Python中=、copy、deepcopy

    一.Python中的"=" a = 1 b = 1 c = a print(id(a)) print(id(b)) print(id(c)) #输出为 14070784103734 ...

  9. Python之copy模块

    概念 官方解释:Python中的赋值语句不复制对象,它们在目标和对象之间建立索引.对于可变项目或可变项目的集合,有时需要一个副本,以便可以更改一个副本而不更改其他副本.该模块提供通用的浅层和深层cop ...

随机推荐

  1. Ubuntu 安装 tensorflow-gpu 1.4 包含 CUDA 8.0 和cuDNN

    硬件环境:NVIDIA GTX 980 Ti 系统环境:Ubuntu 16.04 64位 一.安装 NVIDIA驱动 关闭 Secure Boot 具体如何禁用 BIOS 中的 Secure Boot ...

  2. 【WPF学习】第六十一章 组织模板资源

    为表达全国各族人民对抗击新冠肺炎疫情斗争牺牲烈士和逝世同胞的深切哀悼,国务院今天发布公告,决定2020年4月4日举行全国性哀悼活动. 当使用控件模板时,需要决定如何更广泛地共享模板,以及是否希望自动地 ...

  3. Nginx打点服务器配置

    Nginx打点服务器配置 什么是打点服务器 他的作用是什么 打点服务器就是记录用户行为的服务器 单独从应用独立出来 目的就是为了减轻应用服务器压力 效果如下: 10.0.1.1 - - [05/Feb ...

  4. Spring Boot整合Thymeleaf视图层

    目录 Spring Boot整合Thymeleaf Spring Boot整合Thymeleaf 的项目步骤 Thymeleaf 语法详解 Spring Boot整合Thymeleaf Spring ...

  5. 怎么处理使用UINavigation(导航控制器时) UIScrollView及其子类UITableView、UICollectionView可能出现的向下偏移64Px或者顶部对齐等问题

    前言           近期在做项目时遇到了好几起由于自动偏移或则没有自动偏移而导致的界面布局问题,尤其是在昨晚新版本赶上IOS9系统升级的时候,刚升级完了后就发现项目里面很多使用UINavgati ...

  6. 用全站 CDN 部署 Discourse 论坛

    Discourse 介绍 Discourse 是一款由 Stack Overflow 的联合创始人--Jeff Atwood,基于 Ruby on Rails 开发的开源论坛.相较于传统论坛,Disc ...

  7. 教你用Cobra开发类似docker的命令行

    目录 前言 一.安装 二.初始化应用 gomod初始化 创建入口文件cmd/root.go 创建主程序main.go 三.生成Command 创建hello子命令 创建version子命令 四.如何设 ...

  8. Java多线程工具类之循环栅栏计数器

    Java多线程下循环计数器 本文主要内容:CyclicBarrier(下文中凯哥就用cycBar来代替)定义介绍:举例说明:代码演示:从源码来看原理及总结:CyclicBarrier与CountDow ...

  9. HDU1166(线段树 +更新单点,求区间总和)、HDU1754(线段树 + 更新单点,求区间最大值)

    线段树简单应用 先附上几张图便与理解,大佬文章传送门1.传送门2 HDU1166:题目描述 线段树 +更新单点,求区间总和 代码如下(递归版) #include<iostream> #in ...

  10. 树形DP——动态规划与数据结构的结合,在树上做DP

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文 ...