python直接赋值、浅拷贝、深拷贝的区别
一:直接赋值
赋值,就是对象的引用,给对象起别名。
i = 8
j = i
print("值是:",i, "地址:",id(i))
print("值是:",j, "地址:",id(j))
输出如下:
值是: 8 地址: 1639640400
值是: 8 地址: 1639640400
i 是一个int类型的对象,j 是指向 i 变量对应的对象,其实是内存地址。可以看到,j和i的值和地址都是一样的,
b = a: 赋值引用,a 和 b 都指向同一个对象。
二:浅拷贝
拷贝父对象,不会拷贝对象的内部的子对象。
a = [1,2,[3,4,5,6]]
b = a.copy() print(a, "\t", id(a), id(a[2]))
print(b, "\t", id(b), id(b[2])) a[2].append("abc")
print(a)
print(b)
输出如下:可以看到,a和b的内存地址不一样,但a[2]和b[2]的内存地址是一样的,说明指向的是同意个对象,对父对象进行操作,会印象拷贝对象。
[1, 2, [3, 4, 5, 6]] 2091843623432 2091843623368
[1, 2, [3, 4, 5, 6]] 2091843623752 2091843623368
[1, 2, [3, 4, 5, 6, 'abc']]
[1, 2, [3, 4, 5, 6, 'abc']]
b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。
三:深拷贝
copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
import copy
a = [1,2,[3,4,5,6]]
b = copy.deepcopy(a) print(a, "\t", id(a), id(a[2]))
print(b, "\t", id(b), id(b[2])) a[2].append("abc")
print(a)
print(b)
输出如下:可以看到,这一次a和b的内存地址也不一样了,且对父对象进行操作,不会印象拷贝对象。
[1, 2, [3, 4, 5, 6]] 2143840475656 2143840475592
[1, 2, [3, 4, 5, 6]] 2143840475976 2143840475912
[1, 2, [3, 4, 5, 6, 'abc']]
[1, 2, [3, 4, 5, 6]]
b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。
参考文章:https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html
***************不积跬步无以至千里***************
python直接赋值、浅拷贝、深拷贝的区别的更多相关文章
- python中赋值-浅拷贝-深拷贝之间的关系
赋值: 变量的引用,没有拷贝空间 对象之间赋值本质上 是对象之间的引用传递而已.也就是多个对象指向同一个数据空间. 拷贝的对象分两种类型: . 拷贝可变类型 浅拷贝: 只拷贝第一层数据,不关心里面的第 ...
- python中赋值,深拷贝,浅拷贝区别
这三种 的区别就是 复制的变量 是否是原变量的引用. 赋值:只是原变量的引用. 浅拷贝和深拷贝的区别 需要通过 子元素 区分 浅拷贝:子元素的 引用相同 深拷贝:所以引用都不相同,完全复制一份 这三种 ...
- python开发_copy(浅拷贝|深拷贝)_博主推荐
在python中,有着深拷贝和浅拷贝,即copy模块 下面我们就来聊一下: 运行效果: ================================================== 代码部分: ...
- python的赋值,深拷贝和浅拷贝的区别
原文地址https://www.cnblogs.com/xueli/p/4952063.html 赋值:a = [1,2,3,["a","b"]] b=a,那 ...
- 深入理解Python中赋值、深拷贝(deepcopy)、浅拷贝(copy)
赋值 python跟java中的变量本质是不一样的,Python的变量实质上是一个指针(int型或str型),而java的变量是一个可操作的存储空间. a = 123b = a print(id(a) ...
- python 中的 赋值 浅拷贝 深拷贝
1.对象的赋值 都是进行对象引用(内存地址)传递,即 b is a ,a 变 b也变 2.浅拷贝 会创建一个新的对象,对于对象中的元素,浅拷贝就只会使用原始元素的引用(内存地址) 当我们使用下面的操作 ...
- 搞不懂JS中赋值·浅拷贝·深拷贝的请看这里
前言 百科定义:拷贝就是拷贝指向对象的指针,意思就是说:拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间,浅拷贝只是一种简单的拷贝,让几个对象公用一个内存,然而当内存销毁的时候,指向这 ...
- [Python] 等号赋值, copy, deepcopy的区别
参考链接: 1. 介绍python中的可变类型与不可变类型:https://blog.csdn.net/answer3lin/article/details/86430074 (也可以参考转载博客 P ...
- Python练习四-浅拷贝&深拷贝
一.数字.字符串不论是浅拷贝.深拷贝都是指向一个地址. a = 1 b = "abc" print (id(a)) print (id(b)) a1 = a b1 = b prin ...
- Python中的浅拷贝 深拷贝
浅拷贝只拷贝父对象,子对象的地址空间不改变,包括下面三种: 1. copy 从下面的例子可以看出对象c从a拷贝,当对象a增加一个列表元素之后,c对象没有改变, 而当对象a中的子列表改变时,对象c的子列 ...
随机推荐
- mybatis中 == 和 != 的用法
!= 的用法 <if test="xxx != null and xxx !=''"> == 的用法(相较于!=,仅需将双引号和单引号的位置换一下即可) <if ...
- 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU开发那些事 - 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是恩智浦i.MX RTxxx系列微控制器相关知识. 恩智浦半导体于2018年10月发布的i.MX RTxxx系列开启了ML/AI MCU ...
- Mybatis的PageHelper分页插件的PageInfo的属性参数,成员变量的解释,以及页面模板
作者:个人微信公众号:程序猿的月光宝盒 //当前页 private int pageNum; //每页的数量 private int pageSize; //当前页的数量 private int si ...
- Dynamics 365 Customer Engagement V9.X新引入的自动编号属性介绍
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- cesium 雷达扫描(附源码下载)
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...
- SVN安装及其汉化
1.百度搜索SVN,点击官网进去 2.点击download进入下载页面,选择合适的安装包 3.当前页面往下拉,看到汉化包下载页面,要注意版本 4.2个下载完,先安装软件在安装汉化包,要注意软件和汉化包 ...
- hadoop搭建的前期准备
这个hadoop的搭建是以比赛前的练习为目的的,所以我直接以root用户来搭建hadoop,主要也是方便我自己以后复习用的 需要的软件:vmware15.5,xshell6,xftp6,jdk Lin ...
- 一些常用的 redis 的操作配置(对String、hash)
import java.util.List; import java.util.Map; import org.apache.logging.log4j.LogManager; import org. ...
- 2019阿里天猫团队Java高级工程师面试题之第二面
2019阿里天猫团队Java高级工程师面试题之第一面 2019阿里天猫团队Java高级工程师面试题之第三面 1.Tomcat的基本架构是什么? https://blog.csdn.net/xlgen1 ...
- vue axios 在 edge 浏览器下的bug
Edge 浏览器的版本: Microsoft Edge 42.17134.1.0Microsoft EdgeHTML 17.17134 当请求为POST 时,转换为 GET,并且始终报 “来自缓存 ...