您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python中可變類型和不可變類型及引用的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
在Python中定義一個數據便在內存中開辟一片空間來存儲這個變量的值,這塊已經被分配的內存空間便會有一個內存地址。訪問這塊內存需要用到變量名,變量名實際存儲的是變量的地址在內存中的地址,但是使用print()函數得到的確實這塊內存中實際的地址。這個就當成規定就好,沒必要糾結。
獲得變量在內存中的地址,可以使用id()函數。
常規使用
變量之間的賦值其實是把一個變量的內存地址傳遞給另一個變量,這樣兩個變量便都指向內存中的同一塊空間,因此這兩個變量的之是相等的
a = 1 b = a print("a:%d b:%d" % (a,b)) print(id(a)) print(id(b)) 結果: a:1 b:1 1711072016
此時如果有第三個變量c的值與a的相等,那么c的地址與a的地址一樣。這一點請大家牢記。
a = 1 c = 1 print("a:%d c:%d" % (a,c)) print(id(a)) print(id(c)) 結果: a:1 c:1 1711072016
此時如果修改變量c的值,那么會在內存中新開辟一塊內存來存儲這個變量,這塊新的內存地址將會賦值給c。
a = 1 c = 1 c = 2 print("a:%d c:%d" % (a,c)) print(id(a)) print(id(c)) 結果: a:1 c:2 1711072032
基本數據類型作為函數參數
基本數據類型作為函數實參同樣是這個道理。
a = 1 print(id(a)) def func(x): print(id(x)) x = 2 print(id(x)) func(a) 結果: 1711072016
列表、字典等高級數據類型的引用
列表字典等高級數據類型的變量名同樣存儲的變量的實際地址,一個列表名賦值給另一個變量,那么這兩個變量便指向內存中的同一塊地址。
list1 = [1,2,3] list2 = list1 print(list1,list2) print(id(list1),id(list2)) 結果: [1, 2, 3] [1, 2, 3] 57931896
高級數據類型在每集加載進內存的時候內存地址與上一次可能會不同。
此時如果修改list2,也會影響list1的值,但是兩個變量在內存中的地址還是不變的。這一點是與基本數據類型不一樣的。
list1 = [1,2,3] list2 = list1 print(list1,list2) print(id(list1),id(list2)) list2.append(4) print(list1,list2) print(id(list1),id(list2)) 結果: [1, 2, 3] [1, 2, 3] 43841656 [1, 2, 3, 4] [1, 2, 3, 4] 43841656
此時如果有第三個列表list3的值也是[1,2,3,4],可以推測list3的地址與list1的地址應該是一樣的,但是事實并非如此。如果有第三個列表list3的值也是[1,2,3,4],相當于在內存中新開辟一塊內存來存儲這個值。
list1 = [1,2,3] list2 = list1 list3 = [1,2,3] print(list1,list2,list3) print(id(list1),id(list2),id(list3)) 結果: [1, 2, 3] [1, 2, 3] [1, 2, 3] 16775288 16776768
可變數據類型與不可變數據類型
在python中哪些是可變數據類型,哪些是不可變數據類型。可變數據類型:列表list和字典dict;不可變數據類型:整型int、浮點型float、字符串型string和元組tuple。
用一句話來概括上述過程就是:“python中的不可變數據類型,不允許變量的值發生變化,如果改變了變量的值,相當于是新建了一個對象,而對于相同的值的對象,在內存中則只有一個對象,內部會有一個引用計數來記錄有多少個變量引用這個對象;可變數據類型,允許變量的值發生變化,即如果對變量進行append、+=等這種操作后,只是改變了變量的值,而不會新建一個對象,變量引用的對象的地址也不會變化,不過對于相同的值的不同對象,在內存中則會存在不同的對象,即每個對象都有自己的地址,相當于內存中對于同值的對象保存了多份,這里不存在引用計數,是實實在在的對象。
關于“Python中可變類型和不可變類型及引用的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。