浅析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在hadoop上跑起来
Jan 27 Python
Pycharm学习教程(2) 代码风格
May 02 Python
简单学习Python多进程Multiprocessing
Aug 29 Python
Python编程pygame模块实现移动的小车示例代码
Jan 03 Python
Django model序列化为json的方法示例
Oct 16 Python
详解Python基础random模块随机数的生成
Mar 23 Python
Falsk 与 Django 过滤器的使用与区别详解
Jun 04 Python
Python3.0 实现决策树算法的流程
Aug 08 Python
Python实现的爬取豆瓣电影信息功能案例
Sep 15 Python
Python超越函数积分运算以及绘图实现代码
Nov 20 Python
python实现逢七拍腿小游戏的思路详解
May 26 Python
使用Python画了一棵圣诞树的实例代码
Nov 27 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
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
php缓冲 output_buffering的使用详解
2013/06/13 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
2019/05/13 PHP
对laravel的session获取与存取方法详解
2019/10/08 PHP
php libevent 功能与使用方法详解
2020/03/04 PHP
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
appendChild() 或 insertBefore()使用与区别介绍
2013/10/11 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
推荐5 个常用的JavaScript调试技巧
2015/01/08 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
深入分析jsonp协议原理
2015/09/26 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
JS获取月份最后天数、最大天数与某日周数的方法
2015/12/08 Javascript
vuejs实现折叠面板展开收缩动画效果
2018/09/06 Javascript
通过seajs实现JavaScript的模块开发及按模块加载
2019/06/06 Javascript
js JSON.stringify()基础详解
2019/06/19 Javascript
微信小程序 生成携带参数的二维码
2019/10/23 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python通过post提交数据的方法
2015/05/06 Python
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
python http基本验证方法
2018/12/26 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
flask实现验证码并验证功能
2019/12/05 Python
Django web自定义通用权限控制实现方法
2020/11/24 Python
海淘母婴商城:国际妈咪
2016/07/23 全球购物
波兰最大的度假胜地和城市公寓租赁运营商:Sun & Snow
2018/10/18 全球购物
德国购买踏板车网站:Microscooter
2019/10/14 全球购物
有创意的广告词
2014/03/18 职场文书
正科级干部考察材料
2014/05/29 职场文书
2014旅游局党组书记党建工作汇报材料
2014/11/02 职场文书
2015年团支部工作总结
2015/04/03 职场文书
工伤劳动仲裁代理词
2015/05/25 职场文书
2016年寒假生活小结
2015/10/10 职场文书