浅析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的ORM框架中的SQLAlchemy库的映射关系
Apr 25 Python
在Python的Django框架中生成CSV文件的方法
Jul 22 Python
Python学习笔记整理3之输入输出、python eval函数
Dec 14 Python
tensorflow 打印内存中的变量方法
Jul 30 Python
pandas 条件搜索返回列表的方法
Oct 30 Python
Python实现繁?转为简体的方法示例
Dec 18 Python
20行python代码的入门级小游戏的详解
May 05 Python
python 数据提取及拆分的实现代码
Aug 26 Python
django创建超级用户过程解析
Sep 18 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
Oct 30 Python
Pycharm的Available Packages为空的解决方法
Sep 18 Python
python爬虫破解字体加密案例详解
Mar 02 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 图片上传实现代码 带详细注释
2010/04/29 PHP
利用PHP生成静态HTML文档的原理
2012/10/29 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
PHP利用递归函数实现无限级分类的方法
2019/03/22 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
2019/04/02 PHP
php-fpm重启导致的程序执行中断问题详解
2019/04/29 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
2010/11/23 Javascript
js实现省市联动效果的简单实例
2014/02/10 Javascript
Javascript中的包装类型介绍
2015/04/02 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
vue-cli项目优化方法- 缩短首屏加载时间
2018/04/01 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
2018/08/22 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
js 数据类型判断的方法
2020/12/03 Javascript
python实现识别相似图片小结
2016/02/22 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
selenium+python实现自动化登录的方法
2018/09/04 Python
python 基于dlib库的人脸检测的实现
2019/11/08 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
美国精油公司:Plant Therapy
2019/05/17 全球购物
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
儿媳婚宴答谢词
2014/01/14 职场文书
简短大学毕业感言
2014/01/18 职场文书
集团公司党的群众路线教育实践活动工作总结
2014/03/03 职场文书
洗发水广告词
2014/03/13 职场文书
公司授权委托书范本
2014/04/03 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
建国70周年的心得体会(2篇)
2019/09/20 职场文书
微信小程序用户授权最佳实践指南
2021/05/08 Javascript