浅析Python中的赋值和深浅拷贝


Posted in Python onAugust 15, 2017

python中,A object  = B object  是一种赋值操作,赋的值不是一个对象在内存中的空间,而只是这个对象在内存中的位置 。

浅析Python中的赋值和深浅拷贝

此时当B对象里面的内容发生更改的时候,A对象也自然而然的会跟着更改。

name = ["root","admin"]
cp_name = name # 对cp_name进行赋值操作
# 对name列表进行插入
name.append('root_temp')
print(name,cp_name) # ['root', 'admin', 'root_temp'] ['root', 'admin', 'root_temp']
print(id(name),id(cp_name)) # 23991960 23991960

而想要进行浅拷贝或者深拷贝,就需要引入copy模块 。

首先来说下浅拷贝,当进行浅拷贝时,使用copy.copy()方法。

import copy
name = ["root","admin"]
# 进行浅拷贝操作
cp_name = copy.copy(name)
# 查看cp_name,name
print(name,cp_name) # ['root', 'admin'] ['root', 'admin'] 拷贝成功
#查看地址
print(id(name),id(cp_name)) # 21146920 21147160 内存地址并不相同
# 尝试对name进行更改
name.append('root_temp')
# 查看cp_name是否更改
print(cp_name) # ['root', 'admin'] 内容并没有更改

A = copy.copy(B) 此时A对象相当于把B对象中的内容给完成的拷贝了一份,存储在了一份新的内存地址当中。

其中有一点需要注意,如下:

import copy
name = ['root','admin',['root_temp','admin_temp']]
cp_name = copy.copy(name)
# 查看两个对象的地址
print(id(name),id(cp_name)) # 24358504 24428952 二者的地址并不相同
# 对name 进行更改
name.append('test')
# 查看cp_name是否更改
print(cp_name) # ['root', 'admin', ['root_temp', 'admin_temp']] cp_name并未更改
# 在来对name中的列表对象进行更改
name[2].append('ttttt')
print(cp_name) # ['root', 'admin', ['root_temp', 'admin_temp', 'ttttt']] 发现cp_name内容发生了变化

在上面的代码中,通过copy.copy()方法把name对象浅拷贝给了cp_name,此时二者的内容相同,但是地址不同,说明通过浅拷贝后,cp_name相当于重新开辟了一块内存空间用来存储拷贝过来的内容。所以说,当name.append()第一次插入值的时候,cp_name对象没有变化,因为cp_name和name 处于两个不同的内存空间,是独立的。

而浅拷贝的问题在于,只能够拷贝第一层的内容,至于说第二层以及第三层或者第n层,对于浅拷贝来说都是无能为力的,只能简单的拷贝一份内存地址。

所以说,对于name 这个对象中,列表第一层发生更改,是不会影响cp_name的,而一旦更改了第二层或者第n层的内容,cp_name都会被影响,因为此时的cp_name对象里面子列表是与name的子列表共享相同的内存空间。

而如果想要对第一层以及第二层甚至第n层都进行彻底的拷贝,那么就需要使用深层拷贝。

深层拷贝需要使用copy模块的deepcopy()方法。

import copy
name = ['root','admin',['root_temp','admin_temp']]
cp_name = copy.deepcopy(name)
# 查看二者的id
print(id(name),id(cp_name)) # 29863528 29933976 地址不同,说明开辟了处于两块不同的空间
# 对name 第一层以及第二层进行更改
name.append('t1')
name[2].append('t2')
# 查看cp_name是否内容发生变化
print(cp_name) # ['root', 'admin', ['root_temp', 'admin_temp']] 内容并未发生更改

此时,cp_name对象并不会被name所影响,无论name对象的第一层列表还是第n层的更改和变化,都不会影响cp_name,因为此时通过深层拷贝,两个对象已经完全的处于两个不同的独立内存空间,而这也就是深层拷贝。

总结

以上所述是小编给大家介绍的Python中的赋值和深浅拷贝,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python调用java模块SmartXLS和jpype修改excel文件的方法
Apr 28 Python
Python中使用装饰器时需要注意的一些问题
May 11 Python
Pycharm学习教程(3) 代码运行调试
May 03 Python
python3实现域名查询和whois查询功能
Jun 21 Python
解决pycharm的Python console不能调试当前程序的问题
Jan 20 Python
对Python3 goto 语句的使用方法详解
Feb 16 Python
详解Python的三种可变参数
May 08 Python
Python增强赋值和共享引用注意事项小结
May 28 Python
Python+AutoIt实现界面工具开发过程详解
Aug 07 Python
Python制作简易版小工具之计算天数的实现思路
Feb 13 Python
python使用html2text库实现从HTML转markdown的方法详解
Feb 21 Python
Python基于Tkinter编写crc校验工具
May 06 Python
Python单例模式的两种实现方法
Aug 14 #Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 #Python
python使用super()出现错误解决办法
Aug 14 #Python
Python SQLite3数据库日期与时间常见函数用法分析
Aug 14 #Python
python itchat实现微信自动回复的示例代码
Aug 14 #Python
Python编程实现控制cmd命令行显示颜色的方法示例
Aug 14 #Python
django 创建过滤器的实例详解
Aug 14 #Python
You might like
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
PHP数组交集的优化代码分析
2011/03/06 PHP
PHP持久连接mysql_pconnect()函数使用介绍
2012/02/05 PHP
php隐藏IP地址后两位显示为星号的方法
2014/11/21 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
2015/11/09 PHP
thinkphp自带验证码全面解析
2016/09/18 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
2018/11/29 PHP
Laravel 实现数据软删除功能
2019/08/21 PHP
容易被忽略的JS脚本特性
2011/09/13 Javascript
nodejs npm package.json中文文档
2014/09/04 NodeJs
JS实现很酷的EMAIL地址添加功能实例
2015/02/28 Javascript
js实现选中页面文字将其分享到新浪微博
2015/11/05 Javascript
有关Promises异步问题详解
2015/11/13 Javascript
一起学写js Calender日历控件
2016/04/14 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
js+HTML5 canvas 实现简单的加载条(进度条)功能示例
2019/07/16 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
Python中的列表知识点汇总
2015/04/14 Python
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
python获取指定时间差的时间实例详解
2017/04/11 Python
使用Python获取网段IP个数以及地址清单的方法
2018/11/01 Python
python实现按行分割文件
2019/07/22 Python
python3实现带多张图片、附件的邮件发送
2019/08/10 Python
python3从网络摄像机解析mjpeg http流的示例
2020/11/13 Python
新闻编辑自荐信
2013/11/03 职场文书
中西医专业毕业生职业规划书
2014/02/24 职场文书
大学生考试作弊检讨书1000字
2014/10/14 职场文书
师范生见习报告
2014/10/31 职场文书
小学校长个人总结
2015/03/03 职场文书
Python快速实现一键抠图功能的全过程
2021/06/29 Python