浅析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使用socket进行简单网络连接的方法
Apr 29 Python
python如何在终端里面显示一张图片
Aug 17 Python
浅谈使用Python变量时要避免的3个错误
Oct 30 Python
Python利用公共键如何对字典列表进行排序详解
May 19 Python
对python PLT中的image和skimage处理图片方法详解
Jan 10 Python
python定时复制远程文件夹中所有文件
Apr 30 Python
利用anaconda保证64位和32位的python共存
Mar 09 Python
python实现socket+threading处理多连接的方法
Jul 23 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
Jan 08 Python
Python %r和%s区别代码实例解析
Apr 03 Python
python实现腾讯滑块验证码识别
Apr 27 Python
解决numpy和torch数据类型转化的问题
May 23 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中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
CI分页类首页、尾页不显示的解决方法
2016/03/28 PHP
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
JavaScript中URL编码函数代码
2011/01/11 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
showModelDialog弹出文件下载窗口的使用示例
2013/11/19 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
漫谈JS引擎的运行机制 你应该知道什么
2016/06/15 Javascript
最实用的jQuery分页插件
2016/10/09 Javascript
利用Javascript实现简单的转盘抽奖
2017/02/13 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
vue实现PC端录音功能的实例代码
2019/06/05 Javascript
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
js实现简单音乐播放器
2020/06/30 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
Python的字典和列表的使用中一些需要注意的地方
2015/04/24 Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
2015/05/11 Python
在Linux下使用Python的matplotlib绘制数据图的教程
2015/06/11 Python
python中的迭代和可迭代对象代码示例
2017/12/27 Python
python构建指数平滑预测模型示例
2019/11/21 Python
Python enumerate函数遍历数据对象组合过程解析
2019/12/11 Python
Python.append()与Python.expand()用法详解
2019/12/18 Python
Python run()函数和start()函数的比较和差别介绍
2020/05/03 Python
学年末自我鉴定
2014/01/21 职场文书
六一儿童节活动策划方案
2014/01/27 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
2015迎新晚会活动总结
2015/07/16 职场文书
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS
默认网关不可用修复后过一会又不好使了解决方法
2022/04/08 数码科技
pd.DataFrame中的几种索引变换的实现
2022/06/16 Python