python的可变和不可变对象
2016-04-29 14:59
621 查看
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?
class Immutable(object):
def __setattr__(self, *args):
raise TypeError("can't modify the value of immutable instance")
__delattr__ = __setattr__
def __init__(self, value):
super(Immutable, self).__setattr__("value", value)
我们可以做如下测试
view
plaincopy
to clipboardprint?
>>> x = Immutable("baiyang")
>>> x.value
'baiyang'
# 重新赋值
>>> x.value = "ibaiyang"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __setattr__
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>
不可变对象(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?
class Immutable(object):
def __setattr__(self, *args):
raise TypeError("can't modify the value of immutable instance")
__delattr__ = __setattr__
def __init__(self, value):
super(Immutable, self).__setattr__("value", value)
我们可以做如下测试
view
plaincopy
to clipboardprint?
>>> x = Immutable("baiyang")
>>> x.value
'baiyang'
# 重新赋值
>>> x.value = "ibaiyang"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in __setattr__
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>
相关文章推荐
- Windows下为Python编译C扩展模块
- 【转载】Python练习册,每天一个小程序
- python多线程thread
- Android自动化测试MonkeyRunner(三)------python基本语法
- 使用python将自己的图片数据集准换成为cnn的数据集
- 使用python和android模拟器做android程序的自动化测试
- python中使用pickle进行序列化
- Python(1)--输入输出
- Python技巧(二)
- [python]fabric实现远程操作和部署
- Python itertools 模块 列表元素 字符串 反向遍历合并
- python中使用字符串前面加r
- ubuntu下python环境变量配置以及将模块放入正确位置
- [python]join函数操作字符串
- 史上最快python 异步消息队列zeromq 简介
- 使用Python进行多进程编程
- Python实现包含min函数的栈
- Python爬虫实战:百度贴吧—妈妈吧
- Python二叉搜索树与双向链表转换实现方法
- python中使用fork创建新的进程