浅析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语言的12个基础知识点小结
Jul 10 Python
python使用cPickle模块序列化实例
Sep 25 Python
Python3处理文件中每个词的方法
May 22 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
Jul 24 Python
python 3.5实现检测路由器流量并写入txt的方法实例
Dec 17 Python
python web.py开发httpserver解决跨域问题实例解析
Feb 12 Python
Python数据分析库pandas基本操作方法
Apr 08 Python
python调用API实现智能回复机器人
Apr 10 Python
Python命名空间的本质和加载顺序
Dec 17 Python
Python反爬虫技术之防止IP地址被封杀的讲解
Jan 09 Python
python Manager 之dict KeyError问题的解决
Dec 21 Python
python模拟实现斗地主发牌
Jan 07 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
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
取得父标签
2006/11/14 Javascript
HTML中事件触发列表与解说
2007/07/09 Javascript
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
nodejs 后缀名判断限制代码
2011/03/31 NodeJs
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
JavaScript删除数组元素的方法
2015/03/20 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
2016/02/15 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
浅谈struts1 & jquery form 文件异步上传
2017/05/25 jQuery
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
2017/08/26 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
在Vue项目中使用d3.js的实例代码
2018/05/01 Javascript
微信小程序后端实现授权登录
2020/02/24 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
对于Python中RawString的理解介绍
2016/07/07 Python
Tornado 多进程实现分析详解
2018/01/12 Python
python微信好友数据分析详解
2018/11/19 Python
python无限生成不重复(字母,数字,字符)组合的方法
2018/12/04 Python
python 并发下载器实现方法示例
2019/11/22 Python
Pycharm 2020.1 版配置优化的详细教程
2020/08/07 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
2021/02/22 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
法国购买隐形眼镜和眼镜网站:Optical Center
2019/10/08 全球购物
新学期班主任寄语
2014/01/18 职场文书
聊城大学毕业生自荐书
2014/02/01 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
承租经营合作者协议书
2014/10/01 职场文书
保证金退回承诺函格式
2015/01/21 职场文书
2016教师学习党章心得体会
2016/01/15 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书