999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

淺談Python 中的可變與不可變數據類型

2020-12-28 12:06:56陳玲
數字技術與應用 2020年11期

陳玲

(瀘州職業技術學院,四川瀘州 646000)

0 引言

初學Python的時候,可能會對Python中的可變類型和不可變類型感到疑惑,而我們實際工作中也常常會遇到Python中的可變類型和不可變類型,正確的使用它們才能產生我們預期的效果。下面本文將從概念、判斷、常見的可變與不可變數據類型、函數參數傳遞的區別等方面對Python的可變類型和不可變類型進行分析。

1 可變與不可變類型的概念

從字面意思來理解,可變類型對象就是指對象的內容可變,而不可變類型對象就是指對象的內容不可變。我們來看一個例子:

示例源代碼 示例運行結果a = 10 print(id(a))a = 20 print(id(a))b = [10]print(id(b))b[0] = 20 print(id(b))140727772846016 140727772846336 2778581568704 2778581568704

在上面的例子中,id函數用于獲取對象的內存地址。把a的值從10修改成20時,a對象的內存地址發生了變化,說明執行a=20時并不是將a所指向的內存地址中存儲的10直接修改成20,而是在內存中新申請了一段內存空間來存儲對象20,然后a再指向對象20,所以兩次id(a)的值的不同,如圖1所示。而b[0]=20,修改列表的第一個元素,兩次id(b)的值相同,說明b指向的內存空間不變,是在存儲10的原有內存空間基礎上直接將10修改成20,如圖2所示。

圖1 修改不可變類型

圖2 修改可變類型

當修改該數據類型對應變量的值,如果存儲變量值對應的內存地址發生了改變,這種數據類型就是不可變數據類型。如果存儲變量值對應的內存地址沒有發生改變,這種數據類型就是可變數據類型。如上例中的整型,將a從10修改成20,存儲20的內存地址已經是一個新地址了,a的引用地址從140727772846016變成140727772846336,已經發生了變化,所以整型是不可變數據類型。將列表b的第一個元素修改成20,b的引用地址依舊是1309544287232,沒有發生改變,所以列表是可變數據類型。

從結果來看,不可變類型變量和可變類型變量的值都能修改,所謂不可變類型,是指不能直接修改變量所引用的內存地址中的這個值,當要改變變量的賦值時,其實是在內存中重新開辟了一段內存空間,將修改后的數據存儲在這個新的內存地址里,變量不再引用原數據的內存地址而是引用新的內存地址了。所謂可變類型,是指變量所引用的內存地址處的值是可以改變的。

2 Python中常見的可變類型和不可變類型

如何判斷Python中的數據類型是可變類型還是不可變類型呢?根據上述的解釋,只需要判斷變量所引用的內存地址處的值能否直接修改,即修改后判斷變量所引用的內存地址值是否改變,通過id()來獲取變量引用的內存地址,value值改變,id值不變即為可變類型,value值改變,id值也隨之改變即為不可變類型。即只需要在改變value值時,使用id()查看變量所引用的內存地址是否變化,就可以知道這種數據類型是可變的還是不可變的。例如:

示例源代碼 示例運行結果flag = T rue print(id(flag))flag = False print(id(flag))140727770666832 140727770666864

從結果來看,當改變布爾類型變量的值時,變量id值也改變了,所以布爾類型是不可變類型。舉一反三,我們能得出判斷出Python中常用的可變類型和不可變類型,如下:

2.1 Python中常用的不可變類型

整數、浮點數、布爾類型、字符串、元組。

2.2 Python中常用的可變類型

列表、字典、集合。

3 可變類型和不可變類型在Python函數參數傳遞中的應用與區別

在調用Python函數時,根據函數的定義情況,有時需要傳遞實參。當函數修改了形參的值時,函數調用結束時,實參類型的不同會導致實參最終的結果不同。我們來看一個傳遞不可變類型實參的例子:

傳遞不可變類型a = 10 print("調用前,a = {},引用地址為{}。".form at(a,id(a)))def m odifyInt(b):# 定義函數print("b 的引用地址為{}。".form at(id(b)))b = 20 print("修改后b 的引用地址為{}。".form at(id(b)))m odifyInt(a)# 調用函數print("調用后,a = {},引用地址為{}。".form at(a,id(a)))運行結果如下:調用前,a = 10,引用地址為140727770945472。b 的引用地址為140727770945472。修改后b 的引用地址為140727770945792。調用后,a = 10,引用地址為140727770945472。

圖3 傳遞不可變類型

函數modifyInt()修改形參b的值為20,調用函數時傳遞了實參a,是整數,為不可變類型,函數調用結束后,a的值仍為10,函數雖然修改了形參的值,但并沒有修改實參的值。從運行結果來看,形參b的引用地址和實參a的引用地址相同,說明函數調用時實際上是把a的引用傳遞給了b,因為b為不可變類型,所以b=20時,是在內存重新開辟了一段內存空間存儲20,然后b的引用指向了這個新的內存地址。如圖3所示,當傳遞不可變類型的實參時,傳遞的是引用,函數修改形參的值并不會修改實參的值[1]。

接下來看一個傳遞可變類型實參的例子:

傳遞可變類型a = [10]print("調用前,a = {},引用地址為{}。".form at(a,id(a)))def m odifyList(b):# 定義函數print("b 的引用地址為{}。".form at(id(b)))b[0] = 20 print("修改后b 的引用地址為{}。".form at(id(b)))m odifyList(a)# 調用函數print("調用后,a = {}".form at(a))運行結果如下:調用前,a = [10],引用地址為1782725414080。b 的引用地址為1782725414080。修改后b 的引用地址為1782725414080。調用后,a = [20]

函數modifyList()修改形參b的第一個元素為20,調用函數時傳遞了實參a,是列表,為可變類型,函數調用結束后,a的第一個元素被修改成了20。函數修改了形參的值,導致了實參值的改變。從運行結果來看,形參b的引用地址和實參a的引用地址相同,說明函數調用時仍然是把a的引用傳遞給了b,因為b為可變類型,所以在b引用指向的內存地址中直接修改了這個值,而沒有重新開辟內存空間來保存這個修改后的值。如圖4所示。當傳遞可變類型的實參時,傳遞的是引用,函數修改形參的值后,實參的值也發生改變[2]。

圖4 傳遞可變類型

4 結語

對于不可變類型,變量(引用)指向的地址的內容是不可變的,改變變量的值只是將變量(引用)指向了新的地址。對于可變類型,變量(引用)指向的地址的內容是可變的,改變變量的值就是直接對原地址內容的改變。整數、浮點數、字符串、布爾類型、元組都是不可變類型,列表、字典、集合是可變類型,在進行函數參數傳遞時,雖然都是引用傳遞,但要區分傳遞的是可變類型還是不可變類型。傳遞不可變類型時,改變形參的值,并不會改變實參的值;傳遞可變類型時,改變形參的值,會改變實參的值。

主站蜘蛛池模板: 91精品国产综合久久不国产大片| 国产日本一线在线观看免费| 国产精品久久自在自2021| 超级碰免费视频91| 成人在线欧美| 国产乱子伦视频三区| 国产亚洲精久久久久久无码AV | 91无码视频在线观看| 亚洲AV无码乱码在线观看代蜜桃 | 亚洲国产欧洲精品路线久久| 亚洲激情99| 亚洲综合中文字幕国产精品欧美| 国产性精品| 在线看片中文字幕| 日韩乱码免费一区二区三区| 色婷婷久久| 99热亚洲精品6码| 亚洲精品大秀视频| 欧美精品高清| www成人国产在线观看网站| 日本免费福利视频| 99久久精品视香蕉蕉| 国产91视频免费观看| 夜夜拍夜夜爽| 亚洲欧美在线精品一区二区| 国产无码精品在线| 久久国产av麻豆| 欧美日韩免费| 亚洲aaa视频| 91一级片| 国产精品无码一二三视频| 国产乱码精品一区二区三区中文| 色偷偷男人的天堂亚洲av| 97色伦色在线综合视频| 一级毛片中文字幕| 91探花在线观看国产最新| 在线无码九区| 免费在线视频a| 99热在线只有精品| 在线a视频免费观看| 免费jjzz在在线播放国产| 丁香婷婷综合激情| 88国产经典欧美一区二区三区| 亚洲 欧美 日韩综合一区| 性喷潮久久久久久久久| 欧美日韩激情在线| 亚洲av成人无码网站在线观看| 人妻无码AⅤ中文字| 久久亚洲精少妇毛片午夜无码| 国产成人盗摄精品| 综合色88| 免费毛片全部不收费的| 无码内射在线| 国产成人精品18| 免费啪啪网址| 国产成人精品第一区二区| 亚洲天堂久久| 人妻丰满熟妇av五码区| 97久久免费视频| 色哟哟国产精品一区二区| 国产成人精品亚洲77美色| 四虎永久在线精品国产免费| 91福利片| 无码AV高清毛片中国一级毛片| 在线观看免费人成视频色快速| 国产精品私拍在线爆乳| 国产一区在线观看无码| 日韩A级毛片一区二区三区| 伊人久久精品无码麻豆精品| 极品国产一区二区三区| 草逼视频国产| 国产日韩AV高潮在线| 美女一级毛片无遮挡内谢| 99re精彩视频| 欧美午夜网站| 日韩美毛片| 爽爽影院十八禁在线观看| 免费 国产 无码久久久| 一级毛片免费播放视频| 亚洲浓毛av| 久久久久久久久18禁秘| 亚洲日本在线免费观看|