全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

浅析Python中的赋值和深浅拷贝

python中,A object  = B object  是一种赋值操作,赋的值不是一个对象在内存中的空间,而只是这个对象在内存中的位置 。

此时当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的深浅拷贝以及fromkeys的用法  # 浅述python中深浅拷贝原理  # 浅谈Python对内存的使用(深浅拷贝)  # 详解python深浅拷贝区别  # 第一层  # 第二层  # 小编  # 象中  # 都是  # 是一种  # 在此  # 开辟了  # 给了  # 给大家  # 在上面  # 而这  # 改了  # 已经完全  # 两块  # 自然而然  # 所述  # 需要注意  # 给我留言  # 感谢大家 


相关文章: 如何快速查询域名建站关键信息?  如何通过商城自助建站源码实现零基础高效建站?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  制作企业网站建设方案,怎样建设一个公司网站?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  制作网站的软件免费下载,免费制作app哪个平台好?  建站之家VIP精选网站模板与SEO优化教程整合指南  金*站制作公司有哪些,金华教育集团官网?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  如何在云主机上快速搭建多站点网站?  如何在阿里云虚拟主机上快速搭建个人网站?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  深圳网站制作培训,深圳哪些招聘网站比较好?  小型网站建站如何选择虚拟主机?  建站与域名管理如何高效结合?  c# await 一个已经完成的Task会发生什么  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  建站之星如何优化SEO以实现高效排名?  如何通过FTP服务器快速搭建网站?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  如何基于云服务器快速搭建网站及云盘系统?  已有域名和空间如何搭建网站?  如何通过老薛主机一键快速建站?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  大连网站设计制作招聘信息,大连投诉网站有哪些?  ,怎么用自己头像做动态表情包?  如何在景安服务器上快速搭建个人网站?  定制建站方案优化指南:企业官网开发与建站费用解析  网站制作知乎推荐,想做自己的网站用什么工具比较好?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  一键网站制作软件,义乌购一件代发流程?  如何通过西部数码建站助手快速创建专业网站?  建站之星如何助力企业快速打造五合一网站?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何在橙子建站中快速调整背景颜色?  如何在建站宝盒中设置产品搜索功能?  建站之星3.0如何解决常见操作问题?  浅谈Javascript中的Label语句  微信小程序 五星评分(包括半颗星评分)实例代码  制作证书网站有哪些,全国城建培训中心证书查询官网?  Android使用GridView实现日历的简单功能  建站主机功能解析:服务器选择与快速搭建指南  广平建站公司哪家专业可靠?如何选择?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  Swift中循环语句中的转移语句 break 和 continue 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。