欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python變量的存儲原理詳解

系統 1872 0

變量的存儲

在高級語言中,變量是對內存及其地址的抽象。

對于python而言,python的一切變量都是對象,變量的存儲,采用了引用語義的方式,存儲的只是一個變量的值所在的內存地址,而不是這個變量的只本身。

引用語義: 在python中,變量保存的是對象(值)的引用,我們稱為引用語義。采用這種方式,變量所需的存儲空間大小一致,因為變量只是保存了一個引用。也被稱為對象語義和指針語義。

值語義: 有些語言采用的不是這種方式,它們把變量的值直接保存在變量的存儲區里,這種方式被我們稱為值語義,例如C語言,采用這種存儲方式,每一個變量在內存中所占的空間就要根據變量實際的大小而定,無法固定下來。

由于python中的變量都是采用的引用語義,數據結構可以包含基礎數據類型,導致了在python中每個變量中都存儲了這個變量的地址,而不是值本身;

對于復雜的數據結構來說,里面的存儲的也只只是每個元素的地址而已,下面給出基礎類型和數據結構類型變量重新賦值的存儲變化:

1.數據類型重新初始化對python語義引用的影響

變量的每一次初始化,都開辟了一個新的空間,將新內容的地址賦值給變量。對于下圖來說,我們重復的給str1賦值,其實在內存中的變化如下右圖:

從上圖我們可以看出,str1在重復的初始化過程中,是因為str1中存儲的元素地址由'hello world'的地址變成了'new hello world'的。

2.數據結構內部元素變化重對python語義引用的影響

對于復雜的數據類型來說,改變其內部的值對于變量的影響:

python變量的存儲原理詳解_第1張圖片

python變量的存儲原理詳解_第2張圖片

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

變量賦值

1.str的賦值

python變量的存儲原理詳解_第3張圖片

python變量的存儲原理詳解_第4張圖片

我們剛剛已經知道,str1的再次初始化(賦值)會導致內存地址的改變,從上圖的結果我們可以看出修改了str1之后,被賦值的str2從內存地址到值都沒有受到影響。

看內存中的變化,起始的賦值操作讓str1和str2變量都存儲了‘hello world'所在的地址,重新對str1初始化,使str1中存儲的地址發生了改變,指向了新建的值,此時str2變量存儲的內存地址并未改變,所以不受影響。

2.復雜的數據結構中的賦值

剛剛我們看了簡單數據類型的賦值,現在來看復雜數據結構變化對應內存的影響。

python變量的存儲原理詳解_第5張圖片

python變量的存儲原理詳解_第6張圖片

上圖對列表的增加修改操作,沒有改變列表的內存地址,lst1和lst2都發生了變化。

對照內存圖我們不難看出,在列表中添加新值時,列表中又多存儲了一個新元素的地址,而列表本身的地址沒有變化,所以lst1和lst2的id均沒有改變并且都被添加了一個新的元素。

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

淺拷貝

首先,我們來了解一下淺拷貝。淺拷貝:不管多么復雜的數據結構,淺拷貝都只會copy一層。下面就讓我們看一張圖,來了解一下淺淺拷貝的概念。

python變量的存儲原理詳解_第7張圖片

python變量的存儲原理詳解_第8張圖片

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

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

右圖在原有的基礎上多出了一個淺拷貝的copylist,

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

sourcelist和copylist表面上看起來一模一樣,但是實際上在內存中已經生成了一個新列表,copy了sourceLst,獲得了一個新列表,存儲了5個字符串和一個列表所在內存的地址。

我們看下面分別對兩個列表進行的操作,紅色的框框里面是變量初始化,初始化了上面的兩個列表;我們可以分別對這兩個列表進行操作,例如插入一個值,我們會發現什么呢?如下所示:

python變量的存儲原理詳解_第9張圖片

從上面的代碼我們可以看出,對于sourceLst和copyLst列表添加一個元素,這兩個列表好像是獨立的一樣都分別發生了變化,但是當我修改lst的時候,這兩個列表都發生了變化,這是為什么呢?我們就來看一張內存中的變化圖:

python變量的存儲原理詳解_第10張圖片

我們可以知道sourceLst和copyLst列表中都存儲了一坨地址,當我們修改了sourceLst1的元素時,相當于用'sourceChange'的地址替換了原來'str1'的地址,所以sourceLst的第一個元素發生了變化。而copyLst還是存儲了str1的地址,所以copyLst不會發生改變。

當sourceLst列表發生變化,copyLst中存儲的lst內存地址沒有改變,所以當lst發生改變的時候,sourceLst和copyLst兩個列表就都發生了改變。

這種情況發生在字典套字典、列表套字典、字典套列表,列表套列表,以及各種復雜數據結構的嵌套中,所以當我們的數據類型很復雜的時候,用copy去進行淺拷貝就要非常小心。。。

深拷貝

深拷貝――即python的copy模塊提供的另一個deepcopy方法。深拷貝會完全復制原變量相關的所有數據,在內存中生成一套完全一樣的內容,在這個過程中我們對這兩個變量中的一個進行任意修改都不會影響其他變量。下面我們就來試驗一下。

python變量的存儲原理詳解_第11張圖片

看上面的執行結果,這一次我們不管是對直接對列表進行操作還是對列表內嵌套的其他數據結構操作,都不會產生拷貝的列表受影響的情況。我們再來看看這些變量在內存中的狀況:

python變量的存儲原理詳解_第12張圖片

看了上面的內容,我們就知道了深拷貝的原理。其實深拷貝就是在內存中重新開辟一塊空間,不管數據結構多么復雜,只要遇到可能發生改變的數據類型,就重新開辟一塊內存空間把內容復制下來,直到最后一層,不再有復雜的數據類型,就保持其原引用。這樣,不管數據結構多么的復雜,數據之間的修改都不會相互影響。這就是深拷貝~~~

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品三级a三级三级午夜 | 欧美成人在线影院 | 日本高清中文字幕一区二区三区 | 国产一区二区三区在线 | xx视频在线观看 | 国产高清www免费视频 | 日本成日本片人免费 | 婷婷国产成人久久精品激情 | 欧美一级精品片在线看 | 国产精品美女www爽爽爽视频 | 日本二本三本二区 | 日本免费观看官网 | 黄色毛片视频 | 欧美青青 | 日本免费在线视频 | 国产精品成人国产乱一区 | aⅴ在线免费观看 | 久久久高清免费视频 | 特黄特色大片免费视频观看 | 亚洲精品成人av在线 | 高清久久 | 福利免费在线 | 黑白禁区谭小四 | 午夜影院试看五分钟 | 亚洲永久中文字幕在线 | 欧美一级一级 | 短视频网站免费观看 | 久久久999精品视频 日本高清不卡在线 | 欧美亚洲一区二区三区在线 | 亚洲资源在线 | 欧美精品 在线观看 | 男女激情视频在线观看 | 九九九九九九精品免费 | 日韩av一二三区 | 亚洲综合国产 | 成人免费毛片网站 | 日韩五码在线 | 在线不卡视频 | 婷婷丁香社区 | 亚洲人成网站在线在线 | 亚洲成人精品在线观看 |