真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python中變量的存儲(chǔ)原理是什么-創(chuàng)新互聯(lián)

本篇文章給大家分享的是有關(guān)python中變量的存儲(chǔ)原理是什么,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

創(chuàng)新互聯(lián)公司專(zhuān)注于曲陽(yáng)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供曲陽(yáng)營(yíng)銷(xiāo)型網(wǎng)站建設(shè),曲陽(yáng)網(wǎng)站制作、曲陽(yáng)網(wǎng)頁(yè)設(shè)計(jì)、曲陽(yáng)網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造曲陽(yáng)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供曲陽(yáng)網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。

變量的存儲(chǔ)

在高級(jí)語(yǔ)言中,變量是對(duì)內(nèi)存及其地址的抽象。

對(duì)于python而言,python的一切變量都是對(duì)象,變量的存儲(chǔ),采用了引用語(yǔ)義的方式,存儲(chǔ)的只是一個(gè)變量的值所在的內(nèi)存地址,而不是這個(gè)變量的只本身。

引用語(yǔ)義:在python中,變量保存的是對(duì)象(值)的引用,我們稱(chēng)為引用語(yǔ)義。采用這種方式,變量所需的存儲(chǔ)空間大小一致,因?yàn)樽兞恐皇潜4媪艘粋€(gè)引用。也被稱(chēng)為對(duì)象語(yǔ)義和指針語(yǔ)義。

值語(yǔ)義:有些語(yǔ)言采用的不是這種方式,它們把變量的值直接保存在變量的存儲(chǔ)區(qū)里,這種方式被我們稱(chēng)為值語(yǔ)義,例如C語(yǔ)言,采用這種存儲(chǔ)方式,每一個(gè)變量在內(nèi)存中所占的空間就要根據(jù)變量實(shí)際的大小而定,無(wú)法固定下來(lái)。

由于python中的變量都是采用的引用語(yǔ)義,數(shù)據(jù)結(jié)構(gòu)可以包含基礎(chǔ)數(shù)據(jù)類(lèi)型,導(dǎo)致了在python中每個(gè)變量中都存儲(chǔ)了這個(gè)變量的地址,而不是值本身;

對(duì)于復(fù)雜的數(shù)據(jù)結(jié)構(gòu)來(lái)說(shuō),里面的存儲(chǔ)的也只只是每個(gè)元素的地址而已,下面給出基礎(chǔ)類(lèi)型和數(shù)據(jù)結(jié)構(gòu)類(lèi)型變量重新賦值的存儲(chǔ)變化:

1.數(shù)據(jù)類(lèi)型重新初始化對(duì)python語(yǔ)義引用的影響

變量的每一次初始化,都開(kāi)辟了一個(gè)新的空間,將新內(nèi)容的地址賦值給變量。對(duì)于下圖來(lái)說(shuō),我們重復(fù)的給str1賦值,其實(shí)在內(nèi)存中的變化如下右圖:

python中變量的存儲(chǔ)原理是什么

python中變量的存儲(chǔ)原理是什么

從上圖我們可以看出,str1在重復(fù)的初始化過(guò)程中,是因?yàn)閟tr1中存儲(chǔ)的元素地址由'hello world'的地址變成了'new hello world'的。

2.數(shù)據(jù)結(jié)構(gòu)內(nèi)部元素變化重對(duì)python語(yǔ)義引用的影響

對(duì)于復(fù)雜的數(shù)據(jù)類(lèi)型來(lái)說(shuō),改變其內(nèi)部的值對(duì)于變量的影響:

python中變量的存儲(chǔ)原理是什么

python中變量的存儲(chǔ)原理是什么

當(dāng)對(duì)列表中的元素進(jìn)行一些增刪改的操作的時(shí)候,是不會(huì)影響到lst1列表本身對(duì)于整個(gè)列表地址的,只會(huì)改變其內(nèi)部元素的地址引用??墒钱?dāng)我們對(duì)于一個(gè)列表重新初始化(賦值)的時(shí)候,就給lst1這個(gè)變量重新賦予了一個(gè)地址,覆蓋了原本列表的地址,這個(gè)時(shí)候,lst1列表的內(nèi)存id就發(fā)生了改變。上面這個(gè)道理用在所有復(fù)雜的數(shù)據(jù)類(lèi)型中都是一樣的。

變量賦值

1.str的賦值

python中變量的存儲(chǔ)原理是什么

python中變量的存儲(chǔ)原理是什么

我們剛剛已經(jīng)知道,str1的再次初始化(賦值)會(huì)導(dǎo)致內(nèi)存地址的改變,從上圖的結(jié)果我們可以看出修改了str1之后,被賦值的str2從內(nèi)存地址到值都沒(méi)有受到影響。

看內(nèi)存中的變化,起始的賦值操作讓str1和str2變量都存儲(chǔ)了‘hello world'所在的地址,重新對(duì)str1初始化,使str1中存儲(chǔ)的地址發(fā)生了改變,指向了新建的值,此時(shí)str2變量存儲(chǔ)的內(nèi)存地址并未改變,所以不受影響。

2.復(fù)雜的數(shù)據(jù)結(jié)構(gòu)中的賦值

剛剛我們看了簡(jiǎn)單數(shù)據(jù)類(lèi)型的賦值,現(xiàn)在來(lái)看復(fù)雜數(shù)據(jù)結(jié)構(gòu)變化對(duì)應(yīng)內(nèi)存的影響。

python中變量的存儲(chǔ)原理是什么

python中變量的存儲(chǔ)原理是什么

上圖對(duì)列表的增加修改操作,沒(méi)有改變列表的內(nèi)存地址,lst1和lst2都發(fā)生了變化。

對(duì)照內(nèi)存圖我們不難看出,在列表中添加新值時(shí),列表中又多存儲(chǔ)了一個(gè)新元素的地址,而列表本身的地址沒(méi)有變化,所以lst1和lst2的id均沒(méi)有改變并且都被添加了一個(gè)新的元素。

簡(jiǎn)單的比喻一下,我們出去吃飯,lst1和lst2就像是同桌吃飯的兩個(gè)人,兩個(gè)人公用一張桌子,只要桌子不變,桌子上的菜發(fā)生了變化兩個(gè)人是共同感受的。

淺拷貝

首先,我們來(lái)了解一下淺拷貝。淺拷貝:不管多么復(fù)雜的數(shù)據(jù)結(jié)構(gòu),淺拷貝都只會(huì)copy一層。下面就讓我們看一張圖,來(lái)了解一下淺淺拷貝的概念。

python中變量的存儲(chǔ)原理是什么

python中變量的存儲(chǔ)原理是什么

看上面兩張圖,我們加入左圖表示的是一個(gè)列表

sourcelist,sourcelist = ['str1','str2','str3','str4','str5',['str1','str2','str3','str4','str5']];

右圖在原有的基礎(chǔ)上多出了一個(gè)淺拷貝的copylist,

copylist = ['str1','str2','str3','str4','str5',['str1','str2','str3','str4','str5']];

sourcelist和copylist表面上看起來(lái)一模一樣,但是實(shí)際上在內(nèi)存中已經(jīng)生成了一個(gè)新列表,copy了sourceLst,獲得了一個(gè)新列表,存儲(chǔ)了5個(gè)字符串和一個(gè)列表所在內(nèi)存的地址。

我們看下面分別對(duì)兩個(gè)列表進(jìn)行的操作,紅色的框框里面是變量初始化,初始化了上面的兩個(gè)列表;我們可以分別對(duì)這兩個(gè)列表進(jìn)行操作,例如插入一個(gè)值,我們會(huì)發(fā)現(xiàn)什么呢?如下所示:

python中變量的存儲(chǔ)原理是什么

從上面的代碼我們可以看出,對(duì)于sourceLst和copyLst列表添加一個(gè)元素,這兩個(gè)列表好像是獨(dú)立的一樣都分別發(fā)生了變化,但是當(dāng)我修改lst的時(shí)候,這兩個(gè)列表都發(fā)生了變化,這是為什么呢?我們就來(lái)看一張內(nèi)存中的變化圖:

python中變量的存儲(chǔ)原理是什么

我們可以知道sourceLst和copyLst列表中都存儲(chǔ)了一坨地址,當(dāng)我們修改了sourceLst1的元素時(shí),相當(dāng)于用'sourceChange'的地址替換了原來(lái)'str1'的地址,所以sourceLst的第一個(gè)元素發(fā)生了變化。而copyLst還是存儲(chǔ)了str1的地址,所以copyLst不會(huì)發(fā)生改變。

當(dāng)sourceLst列表發(fā)生變化,copyLst中存儲(chǔ)的lst內(nèi)存地址沒(méi)有改變,所以當(dāng)lst發(fā)生改變的時(shí)候,sourceLst和copyLst兩個(gè)列表就都發(fā)生了改變。

這種情況發(fā)生在字典套字典、列表套字典、字典套列表,列表套列表,以及各種復(fù)雜數(shù)據(jù)結(jié)構(gòu)的嵌套中,所以當(dāng)我們的數(shù)據(jù)類(lèi)型很復(fù)雜的時(shí)候,用copy去進(jìn)行淺拷貝就要非常小心。。。

深拷貝

深拷貝——即python的copy模塊提供的另一個(gè)deepcopy方法。深拷貝會(huì)完全復(fù)制原變量相關(guān)的所有數(shù)據(jù),在內(nèi)存中生成一套完全一樣的內(nèi)容,在這個(gè)過(guò)程中我們對(duì)這兩個(gè)變量中的一個(gè)進(jìn)行任意修改都不會(huì)影響其他變量。下面我們就來(lái)試驗(yàn)一下。

python中變量的存儲(chǔ)原理是什么

看上面的執(zhí)行結(jié)果,這一次我們不管是對(duì)直接對(duì)列表進(jìn)行操作還是對(duì)列表內(nèi)嵌套的其他數(shù)據(jù)結(jié)構(gòu)操作,都不會(huì)產(chǎn)生拷貝的列表受影響的情況。我們?cè)賮?lái)看看這些變量在內(nèi)存中的狀況:

python中變量的存儲(chǔ)原理是什么

以上就是python中變量的存儲(chǔ)原理是什么,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


文章名稱(chēng):python中變量的存儲(chǔ)原理是什么-創(chuàng)新互聯(lián)
路徑分享:http://weahome.cn/article/dsdpjh.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部