1. 程式人生 > >python的可變和不可變物件

python的可變和不可變物件

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__方法,例如:

  1. class Immutable(object):  
  2.     def __setattr__(self, *args):  
  3.         raise TypeError("can't modify the value of immutable instance")  
  4.     __delattr__ = __setattr__  
  5.     def __init__(
    self, value):  
  6.          super(Immutable, self).__setattr__("value", value)  

我們可以做如下測試

  1. >>> x = Immutable("baiyang")  
  2. >>> x.value  
  3. 'baiyang'
  4. # 重新賦值
  5. >>> x.value = "ibaiyang"
  6. Traceback (most recent call last):  
  7.   File "<stdin>", line 1in <module>  
  8.   File "<stdin>"
    , line 3in __setattr__  
  9. TypeError: can't modify immutable instance  
  10. # 刪除
  11. >>> del x.value  
  12. Traceback (most recent call last):  
  13.   File "<stdin>", line 1in <module>  
  14.   File "<stdin>", line 3in __setattr__  
  15. TypeError: can't modify immutable instance  
  16. </stdin></module></stdin></stdin></module></stdin>