浅析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生成pdf文件的方法
Aug 04 Python
Request的中断和ErrorHandler实例解析
Feb 12 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
Mar 19 Python
浅谈python配置与使用OpenCV踩的一些坑
Apr 02 Python
python游戏地图最短路径求解
Jan 16 Python
python调用Matplotlib绘制分布点图
Oct 18 Python
Python学习笔记之函数的参数和返回值的使用
Nov 20 Python
Python数据持久化存储实现方法分析
Dec 21 Python
python+tifffile之tiff文件读写方式
Jan 13 Python
将tensorflow模型打包成PB文件及PB文件读取方式
Jan 23 Python
有关pycharm登录github时有的时候会报错connection reset的问题
Sep 15 Python
5个pandas调用函数的方法让数据处理更加灵活自如
Apr 24 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
C# Assembly类访问程序集信息
2009/06/13 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
PHP设计模式之工厂方法设计模式实例分析
2018/04/25 PHP
PHP实现微信对账单处理
2018/10/01 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
2018/10/12 PHP
excel操作之Add Data to a Spreadsheet Cell
2007/06/12 Javascript
js 小数取整的函数
2010/05/10 Javascript
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
javascript数字格式化通用类 accounting.js使用
2012/08/24 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
2016/03/11 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
2017/02/15 Javascript
angular2+nodejs实现图片上传功能
2017/03/27 NodeJs
EasyUI创建人员树的实例代码
2017/09/15 Javascript
浅谈Vue的加载顺序探讨
2017/10/25 Javascript
Vue数据监听方法watch的使用
2018/03/28 Javascript
js实现一个页面多个倒计时的3种方法
2019/02/25 Javascript
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
[50:01]Ti4 冒泡赛第二天 NEWBEE vs Titan
2014/07/15 DOTA
Python中异常重试的解决方案详解
2017/05/05 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
Python实现中值滤波去噪方式
2019/12/18 Python
使用pandas实现筛选出指定列值所对应的行
2020/12/13 Python
英国50岁以上人群的交友网站:Ourtime
2018/03/28 全球购物
美国家居装饰购物网站:Amanda Lindroth
2020/03/25 全球购物
蟋蟀的住宅教学反思
2014/04/26 职场文书
铅球加油稿100字
2014/09/26 职场文书
实习工作表现评语
2014/12/31 职场文书
2015公司年度工作总结
2015/05/14 职场文书
工程主管竞聘书
2015/09/15 职场文书
详解JAVA的控制语句
2021/11/11 Java/Android