今天去面試一家公司,他們出的面試考題裡有問 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。