Python的可變類型與不可變類型

來源:互聯網
上載者:User

標籤:存在   語句   地址   一個   too   查看   分享   分享圖片   執行   

Python的每個對象都分為可變和不可變,主要的核心類型中,數字、字串、元組是不可變的,列表、字典是可變的。

 

對不可變類型的變數重新賦值,實際上是重新建立一個不可變類型的對象,並將原來的變數重新指向新建立的對象(如果沒有其他變數引用原有對象的話(即引用計數為0),原有對象就會被回收)。

 

不可變類型以int類型為例:實際上 i += 1 並不是真的在原有的int對象上+1,而是重新建立一個value為6的int對象,i引用自這個新的對象。

>>> i = 5>>> i += 1>>> i6

通過id函數查看變數i的記憶體位址進行驗證(使用hex(id(i)) 可以查看16進位的記憶體位址)

>>> i = 5>>> i += 1>>> i6>>> id(i)140243713967984>>> i += 1>>> i7>>> id(i)140243713967960

可以看到執行 i += 1 時,記憶體位址都會變化,因為int 類型是不可變的。

再改改代碼,但多個int類型的變數值相同時,看看它們記憶體位址是否相同。

>>> i = 5>>> j = 5>>> id(i)140656970352216>>> id(j)140656970352216>>> k = 5>>> id(k)140656970352216>>> x = 6>>> id(x)140656970352192>>> y = 6>>> id(y)140656970352192>>> z = 6>>> id(z)140656970352192

對於不可變類型int,無論建立多少個不可變類型,只要值相同,都指向同個記憶體位址。同樣情況的還有比較短的字串。

對於其他類型則不同,以浮點類型為例,從代碼運行結果可以看出它是個不可變類型:對i的值進行修改後,指向新的記憶體位址。

>>> i = 1.5>>> id(i)140675668569024>>> i = i + 1.7>>> i3.2>>> id(i)140675668568976

修改代碼聲明兩個相同值的浮點型變數,查看它們的id,發現它們並不是指向同個記憶體位址,這點和int類型不同(這方面涉及Python記憶體管理機制,Python對int類型和較短的字串進行了緩衝,無論聲明多少個值相同的變數,實際上都指向同個記憶體位址。)。

>>> i = 2.5>>> id(i)140564351733040>>> j = 2.5>>> id(j)140564351733016

 

可變類型的話,以list為例。list在append之後,還是指向同個記憶體位址,因為list是可變類型,可以在原處修改。

>>> a = [1, 2, 3]>>> id(a)4385327224>>> a.append(4)>>> id(a)4385327224

改改代碼,當存在多個值相同的不可變類型變數時,看看它們是不是跟可變類型一樣指向同個記憶體位址

>>> a = [1, 2, 3]>>> id(a)4435060856>>> b = [1, 2, 3]>>> id(b)4435102392

從運行結果可以看出,雖然a、b的值相同,但是指向的記憶體位址不同。我們也可以通過b = a 的指派陳述式,讓他們指向同個記憶體位址:

>>> a = [1, 2, 3]>>> id(a)4435060856>>> b = [1, 2, 3]>>> id(b)4435102392>>> b = a>>> id(b)4435060856

這個時候需要注意,因為a、b指向同個記憶體位址,而a、b的類型都是List,可變類型,對a、b任意一個List進行修改,都會影響另外一個List的值。

>>> b.append(4)>>> a[1, 2, 3, 4]>>> b[1, 2, 3, 4]>>> id(a)4435060856>>> id(b)4435060856

代碼中,b變數append(4),對a變數也是影響的。輸出他們的記憶體位址,還是指向同個記憶體位址。

Python的可變類型與不可變類型

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.