浅析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开发之str.format()用法实例分析
Feb 22 Python
python获取list下标及其值的简单方法
Sep 12 Python
Python实现对象转换为xml的方法示例
Jun 08 Python
Tensorflow 查看变量的值方法
Jun 14 Python
解决安装pycharm后不能执行python脚本的问题
Jan 19 Python
python生成带有表格的图片实例
Feb 03 Python
在python下使用tensorflow判断是否存在文件夹的实例
Jun 10 Python
Flask教程之重定向与错误处理实例分析
Aug 01 Python
在tensorflow中实现去除不足一个batch的数据
Jan 20 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
Apr 08 Python
tensorflow2.0教程之Keras快速入门
Feb 20 Python
Python自然语言处理之切分算法详解
Apr 25 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水印技术
2007/02/14 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
Yii查询生成器(Query Builder)用法实例教程
2014/09/04 PHP
php实现Session存储到Redis
2015/11/11 PHP
Js 本页面传值实现代码
2009/05/17 Javascript
jquery之empty()与remove()区别说明
2010/09/10 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
jQuery遍历json的方法(推荐)
2016/06/12 Javascript
jQuery增加、删除及修改select option的方法
2016/08/19 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
Angular 4依赖注入学习教程之ClassProvider的使用(三)
2017/06/04 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
写一个Vue Popup组件
2019/02/25 Javascript
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
[07:54]DOTA2-DPC中国联赛 正赛 iG vs VG 选手采访
2021/03/11 DOTA
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
Python利用神经网络解决非线性回归问题实例详解
2019/07/19 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
Python递归函数特点及原理解析
2020/03/04 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
2020/03/09 Python
css3媒体查询中device-width和width的区别详解
2020/03/27 HTML / CSS
德国化妆品和天然化妆品网上商店:kosmetikfuchs.de
2017/06/09 全球购物
优秀的计算机专业求职信范文
2013/12/27 职场文书
政府个人对照检查材料思想汇报
2014/10/08 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书
2016年圣诞节义工活动总结
2016/04/01 职场文书
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python
Python中tqdm的使用和例子
2022/09/23 Python