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

view plaincopy to clipboardprint?

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

我们可以做如下测试

view plaincopy to clipboardprint?
  1. >>> x = Immutable("baiyang")  
  2. >>> x.value  
  3. 'baiyang'  
  4. # 重新赋值  
  5. >>> x.value = "ibaiyang"  
  6. Traceback (most recent call last):  
  7.   File "", line 1in   
  8.   File "", line 3in __setattr__  
  9. TypeError: can't modify immutable instance  
  10. # 删除  
  11. >>> del x.value  
  12. Traceback (most recent call last):  
  13.   File "", line 1in   
  14.   File "", line 3in __setattr__  
  15. TypeError: can't modify immutable instance  
  16.  

你可能感兴趣的:(python)