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中的装饰器用法详解
Jan 14 Python
Python Web框架Tornado运行和部署
Oct 19 Python
Python中super()函数简介及用法分享
Jul 11 Python
举例讲解Python常用模块
Mar 08 Python
Django获取应用下的所有models的例子
Aug 30 Python
安装2019Pycharm最新版本的教程详解
Oct 22 Python
基于Python和PyYAML读取yaml配置文件数据
Jan 13 Python
python datetime时间格式的相互转换问题
Jun 11 Python
GitHub上值得推荐的8个python 项目
Oct 30 Python
浅析python实现动态规划背包问题
Dec 31 Python
pytorch 实现L2和L1正则化regularization的操作
Mar 03 Python
python实现MD5进行文件去重的示例代码
Jul 09 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
php快速url重写更新版[需php 5.30以上]
2010/04/25 PHP
Discuz!下Memcache缓存实现方法
2010/05/28 PHP
PHP正则表达式之定界符和原子介绍
2012/10/05 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
2016/11/14 PHP
PHP删除数组中指定下标的元素方法
2018/02/03 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
Smarty模板配置实例简析
2019/07/20 PHP
XAMPP升级PHP版本实现步骤解析
2020/09/04 PHP
Javascript学习笔记一 之 数据类型
2010/12/15 Javascript
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
jquery ajax修改全局变量示例代码
2013/11/08 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
2014/04/02 Javascript
jquery easyui 结合jsp简单展现table数据示例
2014/04/18 Javascript
javascript继承的六大模式小结
2015/04/13 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
浅谈javascript 函数表达式和函数声明的区别
2016/01/05 Javascript
javascript 判断当前浏览器版本并判断ie版本
2017/02/17 Javascript
vue2.0实战之基础入门(1)
2017/03/27 Javascript
jQuery插件DataTables分页开发心得体会
2017/08/22 jQuery
初学者AngularJS的环境搭建过程
2017/10/27 Javascript
chosen实现省市区三级联动
2018/08/16 Javascript
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
vue自定义指令的创建和使用方法实例分析
2018/12/04 Javascript
jquery实现动态创建form并提交的方法示例
2019/05/27 jQuery
vue父子组件通信的高级用法示例
2019/08/29 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
在Django的form中使用CSS进行设计的方法
2015/07/18 Python
通过数据库对Django进行删除字段和删除模型的操作
2015/07/21 Python
Python基于os.environ从windows获取环境变量
2020/06/09 Python
java程序员面试交流
2012/11/29 面试题
经济管理专业毕业生自荐信范文
2014/01/02 职场文书
趣味运动会开幕词
2015/01/28 职场文书
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL