Python object 的 mutable 和 immutable

今天去面試一家公司,他們出的面試考題裡有問 mutalbe 和 immutable 變數有那些。之前曾聽神人同事講過這個,變數的類型會影響到傳遞時的型態。

趕快來惡補一下。

 

在Python 的世界裡,一切皆對象,每個對象各包含一個idendity、type 和value。

  • identity: 可理解為object 的內存地址空間,其值可由id() 函數獲取,一旦object 被創建,其identity 將不可改變。
  • type: 可理解為object 的類型,其值可由type() 函數獲取,一旦object 被創建,其type 也不可該變。
  • value: 可理解為object 的值,和identity 與type 不同,有些object 的value 可變,有些object 的value 永不可變。 我們把value 可變動的object 稱為mutable object,把value 不可變動的object 稱為immutable object。

常見的immutable objects:

  • Numeric types: int, float, complex
  • string
  • tuple
  • frozen set

常見的mutable objects:

  • list
  • dict
  • set
  • byte array

 


Case One

>>> a = [1, 2, 3]
>>> id(a)
4317018016
>>> a[1] = 10
>>> id(a)
4317018016
>>> a
[1, 10, 3]

 

列表的值在a[1] = 10 執行後被改變,但是其地址空間沒有改變。


Case Two

>>> a = 1
>>> id(a)
140207626202088
>>> a = 2
>>> id(a)
140207626202064

 

a = 2 的含義是創建一個值為2 的int 對象,再將a 指向該對象的地址,所以上例的1 和2這兩個int 對象的值並沒有改變。


Case Three

>>> a = (1, 2, [3])
>>> id(a)
4317137728
>>> a[0] = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>>
>>> a[2][0] = 100
>>> id(a)
4317137728
>>> a
(1, 2, [100])

 

immutable 不能理解為絕對的不可變,對於某些container 類型的object,如果它包含了一個mutable 的object,那麼mutable object 的值是可變的。 因為tuple 所含list 改變的只是value 而非identity,所以tuple 依舊被稱為immutable object。

 

 

相關文章

寫留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *