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使用rabbitmq实现网络爬虫示例
Feb 20 Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
Mar 30 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
Jan 31 Python
python 多维切片之冒号和三个点的用法介绍
Apr 19 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
Nov 29 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
Jan 30 Python
pyqt远程批量执行Linux命令程序的方法
Feb 14 Python
如何安装2019Pycharm最新版本(详细教程)
Sep 26 Python
Python list与NumPy array 区分详解
Nov 06 Python
Python对excel的基本操作方法
Feb 18 Python
Python实现拼音转换
Jun 07 Python
python游戏开发之pygame实现接球小游戏
Apr 22 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
桌面中心(三)修改数据库
2006/10/09 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
简单理解PHP的面向对象编程方式
2016/05/17 PHP
PHP编写登录验证码功能 附调用方法
2016/05/19 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
PHP针对redis常用操作实例详解
2019/08/17 PHP
PHP反射原理与用法深入分析
2019/09/28 PHP
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
清空上传控件input file的值
2010/07/03 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
基于jquery的动态创建表格的插件
2011/04/05 Javascript
js获取单选框或复选框值及操作
2012/12/18 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
2015/03/31 Javascript
javascript中eval函数用法分析
2015/04/25 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
JavaScript 数组的进化与性能分析
2017/09/18 Javascript
微信小程序开发常见问题及解决方案
2019/07/11 Javascript
axios封装与传参示例详解
2020/10/18 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
Python使用ftplib实现简易FTP客户端的方法
2015/06/03 Python
Python数据处理numpy.median的实例讲解
2018/04/02 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
python破解同事的压缩包密码
2020/10/14 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
解决python3.6用cx_Oracle库连接Oracle的问题
2020/12/07 Python
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
中国专业的音频分享平台:喜马拉雅
2019/05/24 全球购物
C语言怎样定义和声明全局变量和函数最好
2013/11/26 面试题
个人查摆问题整改措施
2014/10/04 职场文书
2014年计生工作总结
2014/11/21 职场文书
初中作文评语集锦
2014/12/25 职场文书
中学生勤俭节约倡议书
2015/04/29 职场文书
mysql的数据压缩性能对比详情
2021/11/07 MySQL