python的可變和不可變物件
阿新 • • 發佈:2019-02-04
python的物件分為可變物件(mutable)和不可變物件(immutable)
不可變物件(immutable)包括:常數、字串、元組和不可變集合(frozensets)
可變物件包括:列表、字典、自定義類物件(也可用特殊方法定義為不可變類)
所謂不可變物件,就是不能動態修改物件的值或成員
例如:
a=1
print id(a)
a+=1
print id(a)
這兩次列印的ID值並不同,這說明a的地址空間發生了變化,而並沒有在原有地址空間中執行加操作,因為常數1是個不可變物件,不能對其值進行修改。
再例如:
a=[1,2]
print id(a)
a+=[3]
print id(a)
這兩次列印的ID值是相同的,因為列表是可變變數(mutable)
定製immutable的資料型別
定製immutable的資料型別,那麼你必須重寫object的__setattr__和__delattr__方法,例如:
- class Immutable(object):
- def __setattr__(self, *args):
- raise TypeError("can't modify the value of immutable instance")
- __delattr__ = __setattr__
-
def __init__(
- super(Immutable, self).__setattr__("value", value)
我們可以做如下測試
- >>> x = Immutable("baiyang")
- >>> x.value
- 'baiyang'
- # 重新賦值
- >>> x.value = "ibaiyang"
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
-
File "<stdin>"
- TypeError: can't modify immutable instance
- # 刪除
- >>> del x.value
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- File "<stdin>", line 3, in __setattr__
- TypeError: can't modify immutable instance
- </stdin></module></stdin></stdin></module></stdin>