电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

詳解Python直接賦值,深拷貝和淺拷貝

瀏覽:7日期:2022-07-18 09:10:40

直接賦值: 對象的引用,也就是給對象起別名淺拷貝: 拷貝父對象,但是不會拷貝對象的內部的子對象。深拷貝: 拷貝父對象. 以及其內部的子對象

在之前的文章中,提到可變對象和不可變對象,接下來也是以這兩者的區別進行展開

直接賦值

對于可變對象和不可變對象,將一個變量直接賦值給另外一個變量,兩者 id 值一致,其實本質上是將變量量綁定到對象的過程.

>>> a=1>>> b=a>>> id(a) == id(b)True>>> c='string'>>> d=c>>> id(c) == id(d)True>>> e=[1,2,3]>>> f=e>>> id(e)==id(f)True

關于修改新變量的值,對原有變量會產生的影響,在可變對象和不可變對象 中也做了講述,這里通過幾個例子,重新溫習一下

不可變對象

>>> x=1>>> y=x>>> id(x)==id(y)True>>> id(1)==id(y)True>>>>>> id(x)1500143776>>> y=y+1>>> y2>>> x1>>> id(x)==id(y)False>>> id(y)1500143808>>> id(x)1500143776

對于不可變對象,修改賦值后的新變量,不會對原有變量造成任何影響.為什么出現這種現象呢?因為不可變對象一旦創建之后就不允許被改變.后面對 y 進行的操作,其實是重新創建一個對象并綁定的結果:

詳解Python直接賦值,深拷貝和淺拷貝

可變對象

>>> m=[1,2,3]>>> n=m>>> id(n)==id(m)True>>> id(m)1772066764488>>> id(n[0])1772066764656>>> n[0]=4>>> n[4, 2, 3]>>> m[4, 2, 3]>>> id(n)==id(m)True>>> id(m)1772066764488

對于可變對象,修改賦值后的變量,會對原有的變量造成影響,會導致其 value 值的改變,但是其id 值保持不變

詳解Python直接賦值,深拷貝和淺拷貝

從上圖不難看出,這個時候的 id(n[0]) 的值,和未修改前的 id值應該不一樣,可以輸出看一下

>>>id(n[0])1772066764752 # 最初沒有修改前是 1772066764656

n[0] 修改前后為什么 id 值出現改變呢? 首先需要明確一點 n[0] 綁定的是一個不可變對象,在文章的最初提到,不可變對象一旦創建就不允許修改.顯然對 n[0] 進行修改,不能在綁定對象的內存上進行修改,那如何實現重新賦值呢?只能創建一個新的對象 4 ,然后將 n[0] 綁定到新的對象

淺拷貝和深拷貝

先看一下官方文檔的定義

The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists orclass instances).A shallow copy constructs a new compound object and then (to theextent possible) inserts the same objects into it that theoriginal contains.A deep copy constructs a new compound object and then, recursively,inserts copies into it of the objects found in the original.

從文檔中不難看出,上面提到深拷貝和淺拷貝兩者區別在于在復合對象,那接下來也只討論復合對象.

淺拷貝

注意到官方文檔也提到對淺拷貝和深拷貝的定義,從上文中不難看出,淺拷貝構建一個復合對象,然后將原有復合對象包含的對象插入到新的復合對象中

詳解Python直接賦值,深拷貝和淺拷貝

從上圖不難看出,淺拷貝后,新復合對象包含的對象(可變或者不可變)的 id 值和原有對象包含的對象的 id 值相同

看一下具體例子:

>>> import copy>>> a=[1,2,[3,4]]>>> b=copy.copy(a)>>> id(b[0])==id(a[0])True>>> id(b[2])==id(a[2])True>>> id(b[2][0])==id(a[2][0])True

現在讓我們試著修改一下淺拷貝后的 b 的值,在修改前,可以先思考一下,如果修改 b[0] 可能會發生什么?

由于 b[0] = 1,很顯然 1 屬于不可變對象,那么根據對不可變變量修改的規則,則 b[0] 會綁定到新的變量上,而 a[0] 的由于沒有修改,則保持不變,真的是這樣嗎?讓我們驗證一下

>>> b[0]=5>>> b[5, 2, [3, 4]]>>> a[1, 2, [3, 4]]

接下來我們要嘗試修改一下 b[2],由于 b[2] 綁定的對象是 list,屬于可變對象,按照上面說的可變對象修改的規則,則修改后的 b[2] 的 id 值保持不變,但是其 value 值會發生改變. 同樣的讓我們通過例子驗證一下

>>> id(b[2])4300618568>>> b[2][0]=6>>> id(b[2])4300618568>>> b[5, 2, [6, 4]]>>> a[1, 2, [6, 4]]

由于 b[2] 和 a[2] 綁定同一個可變對象,很顯然對 b[2] 的修改同樣會映射到 a[2] 上

深拷貝

深拷貝構建一個復合對象,然后遞歸的將原有復合包含的對象的副本插入到新的復合對象中

詳解Python直接賦值,深拷貝和淺拷貝

若上圖所示,深拷貝后,新的復合對象包含的對象,若對象為不可變對象,則 id 值保持不變,若對象為可變對象,則 id 值發生改變

看一個例子:

>>> import copy>>> a=[1,2,[3,4]]>>> b=copy.deepcopy(a)>>> id(b[0])==id(a[0])True>>> id(b[2])==id(a[0])False>>> id(b[2][0])==id(a[2][0])True

接下來讓我們修改一下變量 b,這里就不在修改不可變對象 b[0] 和 b[1] 了,因為結果很明顯,對 a 不會產生任何影響,我們來修改 b[2],那么修改 b[2] 會對 a[2] 產生影響嗎?很明顯答案是不會,因為深拷貝就相當于克隆出了一個全新的個體,兩者不再有任何關系

>>> b[2][0]=5>>> b[1, 2, [5, 4]]>>> a[1, 2, [3, 4]]

以上就是詳解Python直接賦值,深拷貝和淺拷貝的詳細內容,更多關于Python直接賦值,深拷貝和淺拷貝的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 披萨石_披萨盘_电器家电隔热绵加工定制_佛山市南海区西樵南方综合保温材料厂 | 真空泵厂家_真空泵机组_水环泵_旋片泵_罗茨泵_耐腐蚀防爆_中德制泵 | 不干胶标签,不干胶标签纸_厂家-山东同力胶粘制品 | 带式过滤机厂家_价格_型号规格参数-江西核威环保科技有限公司 | 不锈钢管件(不锈钢弯头,不锈钢三通,不锈钢大小头),不锈钢法兰「厂家」-浙江志通管阀 | 马尔表面粗糙度仪-MAHR-T500Hommel-Mitutoyo粗糙度仪-笃挚仪器 | 水厂自动化|污水处理中控系统|水利信息化|智慧水务|智慧农业-山东德艾自动化科技有限公司 | 电动不锈钢套筒阀-球面偏置气动钟阀-三通换向阀止回阀-永嘉鸿宇阀门有限公司 | 厂房出租-厂房规划-食品技术-厂房设计-厂房装修-建筑施工-设备供应-设备求购-龙爪豆食品行业平台 | 信阳网站建设专家-信阳时代网联-【信阳网站建设百度推广优质服务提供商】信阳网站建设|信阳网络公司|信阳网络营销推广 | 山东聚盛新型材料有限公司-纳米防腐隔热彩铝板和纳米防腐隔热板以及钛锡板、PVDF氟膜板供应商 | 免费网站网址收录网_海企优网站推荐平台 | 陕西视频监控,智能安防监控,安防系统-西安鑫安5A安防工程公司 | 双相钢_双相不锈钢_双相钢圆钢棒_双相不锈钢报价「海新双相钢」 双能x射线骨密度检测仪_dxa骨密度仪_双能x线骨密度仪_品牌厂家【品源医疗】 | BESWICK球阀,BESWICK接头,BURKERT膜片阀,美国SEL继电器-东莞市广联自动化科技有限公司 | 丁基胶边来料加工,医用活塞边角料加工,异戊二烯橡胶边来料加工-河北盛唐橡胶制品有限公司 | 日本细胞免疫疗法_肿瘤免疫治疗_NK细胞疗法 - 免疫密码 | 超声波电磁流量计-液位计-孔板流量计-料位计-江苏信仪自动化仪表有限公司 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 箱式破碎机_移动方箱式破碎机/价格/厂家_【华盛铭重工】 | ICP备案查询_APP备案查询_小程序备案查询 - 备案巴巴 | 深圳网站建设-高端企业网站开发-定制网页设计制作公司 | 沈阳激光机-沈阳喷码机-沈阳光纤激光打标机-沈阳co2激光打标机 | 福州仿石漆加盟_福建仿石漆厂家-外墙仿石漆加盟推荐铁壁金钢(福建)新材料科技有限公司有保障 | 安全阀_弹簧式安全阀_美标安全阀_工业冷冻安全阀厂家-中国·阿司米阀门有限公司 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 培训中心-翰香原香酥板栗饼加盟店总部-正宗板栗酥饼技术 | 西安文都考研官网_西安考研辅导班_考研培训机构_西安在职考研培训 | 上海深蓝_缠绕机_缠膜机-上海深蓝机械装备有限公司 | 塑料托盘厂家直销-吹塑托盘生产厂家-力库塑业【官网】 | 磁力抛光研磨机_超声波清洗机厂家_去毛刺设备-中锐达数控 | 柔软云母板-硬质-水位计云母片组件-首页-武汉长丰云母绝缘材料有限公司 | 好笔杆子网 - 公文写作学习交流分享平台 | PSI渗透压仪,TPS酸度计,美国CHAI PCR仪,渗透压仪厂家_价格,微生物快速检测仪-华泰和合(北京)商贸有限公司 | 吊篮式|移动式冷热冲击试验箱-二槽冷热冲击试验箱-广东科宝 | 低浓度恒温恒湿称量系统,强光光照培养箱-上海三腾仪器有限公司 | 金联宇电缆总代理-金联宇集团-广东金联宇电缆实业有限公司 | 无缝钢管-聊城无缝钢管-小口径无缝钢管-大口径无缝钢管 - 聊城宽达钢管有限公司 | 深圳市超时尚职业培训学校,培训:月嫂,育婴,养老,家政;化妆,美容,美发,美甲. | 代理记账_公司起名核名_公司注册_工商注册-睿婕实业有限公司 |