浅析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中的日志模块logging
Jun 19 Python
Python Matplotlib库安装与基本作图示例
Jan 09 Python
python文件写入write()的操作
May 14 Python
详解python中各种文件打开模式
Jan 19 Python
基于Python获取照片的GPS位置信息
Jan 20 Python
使用Python制作新型冠状病毒实时疫情图
Jan 28 Python
Python变量作用域LEGB用法解析
Feb 04 Python
python 线性回归分析模型检验标准--拟合优度详解
Feb 24 Python
Django import export实现数据库导入导出方式
Apr 03 Python
python模拟点击玩游戏的实例讲解
Nov 26 Python
matplotlib对象拾取事件处理的实现
Jan 14 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
May 30 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/05/04 PHP
浅谈PHP中output_buffering
2015/07/13 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
2019/01/15 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
2019/03/29 PHP
浅谈jQuery中 wrap() wrapAll() 与 wrapInner()的差异
2014/11/12 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
概述BootStrap中role="form"及role作用角色
2016/12/08 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
2016/12/27 Javascript
js实现自动轮换选项卡
2017/01/13 Javascript
Javascript 链式作用域详细介绍
2017/02/23 Javascript
深入理解vue-loader如何使用
2017/06/06 Javascript
微信小程序wxs实现吸顶效果
2020/01/08 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
用Python实现一个简单的线程池
2015/04/07 Python
深入浅析python with语句简介
2018/04/11 Python
python读取xlsx的方法
2018/12/25 Python
python统计中文字符数量的两种方法
2019/01/31 Python
Python with用法:自动关闭文件进程
2019/07/10 Python
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
Python数据分析pandas模块用法实例详解
2019/11/20 Python
PyQt5的QWebEngineView使用示例
2020/10/20 Python
python3爬虫中多线程进行解锁操作实例
2020/11/25 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
关于前端上传文件全面基础扫盲贴(入门)
2019/08/01 HTML / CSS
html5 视频播放解决方案
2016/11/06 HTML / CSS
美国社交购物市场:MassGenie
2019/02/18 全球购物
REN Clean Skincare官网:英国本土有机护肤品牌
2019/02/23 全球购物
大学毕业感言100字
2014/02/03 职场文书
教师节演讲稿
2014/05/06 职场文书
党员目标管理责任书
2014/07/25 职场文书
医院护士党的群众路线教育实践活动对照检查材料思想汇报
2014/10/04 职场文书
法院执行局工作总结
2015/08/11 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
Python面向对象之成员相关知识总结
2021/06/24 Python