python3 深浅copy对比详解


Posted in Python onAugust 12, 2019

一、赋值对比

1、列表

l1 = [1,2,3]
l2 = l1
l1.append('a')
print(l1,l2)        #[1, 2, 3, 'a'] [1, 2, 3, 'a']
print(id(l1),id(l2))     #43499848 43499848
#可以看到两个列表的值以及id值相同,对应的是同一个内存地址

2、字典

dic = {'name':'barry'}
dic1 = dic
dic['age'] = 18
print(dic,dic1)      #{'name': 'barry', 'age': 18} {'name': 'barry', 'age': 18}
print(id(dic),id(dic1))    #31157344 31157344
#可以看到两个字典的值以及id值相同,对应的是同一个内存地址

3、字符串

s = 'alex'
s1 = s
s2 = s.replace('a','A')
print(s,s1,s2)         #alex alex Alex
print(id(s),id(s1),id(s2))      #31040208 31040208 31040376
#赋值是同一个内存地址,替换字符串后的变量s2是另外的地址

二、深浅copy

1、浅copy

对于浅copy来说,第一层创建的是新的内存地址。而从第二层开始,指向的是同一个内存地址,所有,对于第二层以及更深的层数来说,保持一致性。

# 1、普通浅copy

l1 = [1,2,3,4]
l2 = l1.copy()
l1.append('a')
print(l1,l2)           #[1, 2, 3, 4, 'a'] [1, 2, 3, 4]
print(id(l1),id(l2))       #37077320 37078664
#id内存地址不一样,创建了两个地址空间,一个改变,另一个不会变化

# 2、嵌套浅copy

import copy
l1 = [1,[22,33,44],3,4,]
l2 = copy.deepcopy(l1)
# 改变第一层
l1[0] = 111
print(l1,l2)          #[111, [22, 33, 44], 3, 4] [1, [22, 33, 44], 3, 4]
print(id(l1),id(l2))      #43238536 43239048
# 改变第二层
l1[1].append('a')
print(l1,l2)          # [111, [22, 33, 44, 'a'], 3, 4] [1, [22, 33, 44], 3, 4]
print(id(l1),id(l2))      #43238536 43239048

2、 深copy.deepcopy()

对于深copy来说,两个是完全独立的,改变任意一个的元素(无论是多少层),另一个绝不会改变。

import copy
l1 = [1,[22,33,44],3,4,]
l2 = copy.deepcopy(l1)
# 改变第一层
l1[0] = 111
print(l1,l2)          #[111, [22, 33, 44], 3, 4] [1, [22, 33, 44], 3, 4]
print(id(l1),id(l2))      #43238536 43239048
# 改变第二层
l1[1].append('a')
print(l1,l2)          # [111, [22, 33, 44, 'a'], 3, 4] [1, [22, 33, 44], 3, 4]
print(id(l1),id(l2))      #43238536 43239048

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python内置数据类型详解
Aug 18 Python
浅析使用Python操作文件
Jul 31 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
Apr 19 Python
java中两个byte数组实现合并的示例
May 09 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
Jun 11 Python
使用Python AIML搭建聊天机器人的方法示例
Jul 09 Python
基于sklearn实现Bagging算法(python)
Jul 11 Python
Python 分享10个PyCharm技巧
Jul 13 Python
python tkinter窗口最大化的实现
Jul 15 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 Python
Python sorted排序方法如何实现
Mar 31 Python
Python中字符串对象语法分享
Feb 24 Python
Django获取该数据的上一条和下一条方法
Aug 12 #Python
python中的反斜杠问题深入讲解
Aug 12 #Python
Django CBV与FBV原理及实例详解
Aug 12 #Python
Python利用requests模块下载图片实例代码
Aug 12 #Python
django+tornado实现实时查看远程日志的方法
Aug 12 #Python
Django结合ajax进行页面实时更新的例子
Aug 12 #Python
django fernet fields字段加密实践详解
Aug 12 #Python
You might like
多重?l件?合查?(二)
2006/10/09 PHP
PHP脚本中include文件出错解决方法
2008/11/20 PHP
使用php测试硬盘写入速度示例
2014/01/27 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
如何直接访问php实例对象中的private属性详解
2017/10/12 PHP
js计数器代码
2006/11/04 Javascript
Save a File Using a File Save Dialog Box
2007/06/18 Javascript
点图片上一页下一页翻页效果
2008/07/09 Javascript
几个比较实用的JavaScript 测试及效验工具
2010/04/18 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
Angular 根据 service 的状态更新 directive
2016/04/03 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
2017/11/27 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
vue使用nprogress实现进度条
2019/12/09 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
vue框架中props的typescript用法详解
2020/02/17 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
tornado捕获和处理404错误的方法
2014/02/26 Python
编程语言Python的发展史
2014/09/26 Python
python 读取txt,json和hdf5文件的实例
2018/06/05 Python
pyQt4实现俄罗斯方块游戏
2018/06/26 Python
python3+selenium自动化测试框架详解
2019/03/17 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
python中os包的用法
2020/06/01 Python
python调用私有属性的方法总结
2020/07/24 Python
python中操作文件的模块的方法总结
2021/02/04 Python
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
SQL SERVER面试资料
2013/03/30 面试题
了解AppleTalk协议吗
2014/04/01 面试题
班长演讲稿范文
2014/04/24 职场文书
新课培训心得体会
2014/09/03 职场文书
Python使用OpenCV实现虚拟缩放效果
2022/02/28 Python