python數(shù)據(jù)類型可變與不可變深入分析
一.可變類型與不可變類型的特點(diǎn)
1.不可變數(shù)據(jù)類型
不可變數(shù)據(jù)類型在第一次聲明賦值聲明的時(shí)候, 會(huì)在內(nèi)存中開辟一塊空間, 用來存放這個(gè)變量被賦的值, 而這個(gè)變量實(shí)際上存儲(chǔ)的, 并不是被賦予的這個(gè)值, 而是存放這個(gè)值所在空間的內(nèi)存地址, 通過這個(gè)地址, 變量就可以在內(nèi)存中取出數(shù)據(jù)了. 所謂不可變就是說, 我們不能改變這個(gè)數(shù)據(jù)在內(nèi)存中的值, 所以當(dāng)我們改變這個(gè)變量的賦值時(shí), 只是在內(nèi)存中重新開辟了一塊空間, 將這一條新的數(shù)據(jù)存放在這一個(gè)新的內(nèi)存地址里, 而原來的那個(gè)變量就不在引用原數(shù)據(jù)的內(nèi)存地址而轉(zhuǎn)為引用新數(shù)據(jù)的內(nèi)存地址了.
舉例子:
>>> x = 18 >>> id(x) 4497811200 >>> id(18) 4497811200 >>> x = 19 >>> id(x) 4497811232 >>> id(18) 4497811200 >>> y = 18 >>> id(y) 4497811200 >>>

一開始x = 18,開辟一塊地址為4497811200的內(nèi)存,即18對(duì)應(yīng)的地址為4497811200,后來x = 19 ,重新開辟一塊地址為4497811232的內(nèi)存來放19,可以看到不變的意思是指18,和19在內(nèi)存中的地址不會(huì)改變,將18賦值給y時(shí),y指向的地址即為4497811200。
2.可變數(shù)據(jù)類型
結(jié)合不可變數(shù)據(jù)類型,可變數(shù)據(jù)類型就很好理解來,可變數(shù)據(jù)類型是指變量所指向的內(nèi)存地址處的值是可以被改變的。
>>> x = [1,2,3] >>> id(x) 4501838920 >>> y = [1,2,3] >>> z = [1,2,3] >>> id(y) 4501838600 >>> id(z) 4501838664
從另外一個(gè)角度來看:
可變類型:當(dāng)該數(shù)據(jù)類型的對(duì)應(yīng)變量的值發(fā)生了改變,那么它對(duì)應(yīng)的內(nèi)存地址也會(huì)發(fā)生改變,對(duì)于這種數(shù)據(jù)類型,就稱不可變數(shù)據(jù)類型。
可變數(shù)據(jù)類型:當(dāng)該數(shù)據(jù)類型的對(duì)應(yīng)變量的值發(fā)生了改變,那么它對(duì)應(yīng)的內(nèi)存地址不發(fā)生改變,對(duì)于這種數(shù)據(jù)類型,就稱可變數(shù)據(jù)類型。
#a的值改變了,a對(duì)應(yīng)的內(nèi)存地址也改變了 >>> a=1 >>> id(a) 4497810656 >>> a = 2 >>> id(2) 4497810688 #直接對(duì)a操作,相當(dāng)于拷貝了一份a的值,在其他內(nèi)存地址操作,a的值不變 >>> a+1 3 >>> id(a) 4497810688 >>> a 2 #b的值改變了,b對(duì)應(yīng)的內(nèi)存地址不變,第一次給b賦值的時(shí)候,給b劃分一塊內(nèi)存空間,該空間就不變了 >>> b = [1,2,3] >>> id(b) 4501839496 #直接對(duì)b操作,b的值改變,b指向的內(nèi)存空間不變 >>> b.append(4) >>> id(b) 4501839496 >>> b [1, 2, 3, 4] >>>
二.哪些是可變類型哪些是不可變類型
不可變:Number(數(shù)字)、String(字符串)、Tuple(元組)。
#整型 a = 1 print(id(a), type(a)) a = 2 print(id(a), type(a)) # 4361254304 <class 'int'> # 4361254336 <class 'int'> #字符串 b = 'anne' print(id(b),type(b)) b = 'anne1995' print(id(b),type(b)) # 4363638744 <class 'str'> # 4363684784 <class 'str'> #元組 c1 = ['1','2'] c = (1,2,c1) print(c,id(c),type(c)) c1[1] = 'djx' print(c,id(c),type(c)) # (1, 2, ['1', '2']) 4363948248 <class 'tuple'> # (1, 2, ['1', 'djx']) 4363948248 <class 'tuple'>
可以變:Set(集合)、List(列表)、Dictionary(字典)。
#集合
s = {1, 'd', '34', '1', 1}
print(s, type(s), id(s))
s.add('djx')
print(s, type(s), id(s))
# {1, '1', 'd', '34'} <class 'set'> 4401385256
# {1, '1', '34', 'd', 'djx'} <class 'set'> 4401385256
#列表
list = [1,'q','qwer',True]
print(list,type(list),id(list))
list.append('djx')
print(list,type(list),id(list))
# [1, 'q', 'qwer', True] <class 'list'> 4401113608
# [1, 'q', 'qwer', True, 'djx'] <class 'list'> 4401113608
#字典
tuple = (1)
dic = {1:2}
d = { tuple:1,'key2':'djx','key3':'li'}
print(d,type(d),id(d))
d['key4'] = 'haha'
print(d,type(d),id(d))
# {1: 1, 'key2': 'djx', 'key3': 'li'} <class 'dict'> 4401075976
# {1: 1, 'key2': 'djx', 'key3': 'li', 'key4': 'haha'} <class 'dict'> 4401075976注意:此時(shí)元組的值發(fā)生了變化而內(nèi)存地址沒變,但我們依然稱元組為不可變類型,為什么呢?其實(shí)改的是元組中的列表,列表是可變類型,改變了值后地址依然不變。但是元組的定義就是不可變的,
元組被稱為只讀列表,即數(shù)據(jù)可以被查詢,但不能被修改。
以上就是python數(shù)據(jù)類型可變與不可變深入分析的詳細(xì)內(nèi)容,更多關(guān)于python可變不可變數(shù)據(jù)類型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python利用PIL實(shí)現(xiàn)多張圖片合成gif動(dòng)畫的案例詳解
這篇文章主要介紹了Python利用PIL實(shí)現(xiàn)多張圖片合成gif動(dòng)畫的案例,文章通過代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以自己動(dòng)手試一下2023-11-11
利用Python實(shí)現(xiàn)讀取Word文檔里的Excel附件
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)讀取Word文檔里的Excel附件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12
關(guān)于Numpy中argsort()函數(shù)的用法解讀
這篇文章主要介紹了關(guān)于Numpy中argsort()函數(shù)的用法解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
全面了解Nginx, WSGI, Flask之間的關(guān)系
下面小編就為大家分享一篇全面了解Nginx, WSGI, Flask之間的關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01
Python使用Socket(Https)Post登錄百度的實(shí)現(xiàn)代碼
以前都是用一些高級(jí)模塊,封裝的比較好,今天嘗試使用socket模塊登錄百度,弄了半天才弄好,主要由于百度在登陸頁使用了https,我們需要對(duì)socket進(jìn)行一定處理2012-05-05
使用Streamlit和Pandas實(shí)現(xiàn)帶有可點(diǎn)擊鏈接的數(shù)據(jù)表格
這篇文章主要為大家詳細(xì)介紹了如何利用?Streamlit?和?Pandas?在?Python?中創(chuàng)建一個(gè)帶有可點(diǎn)擊鏈接的數(shù)據(jù)表格,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
利用soaplib搭建webservice詳細(xì)步驟和實(shí)例代碼
這篇文章主要介紹了使用python soaplib搭建webservice詳細(xì)步驟和實(shí)例代碼,大家可以參考使用2013-11-11

