Python interview - mutable & immutable

python中的数据类型有分可变类型mutable 和 不可变类型 immutable。


Mutable:

list

dictionary

set

classes

class instances


Immutable:

integer and other numerical types; 

string types like str and unicode; 

tuples

frozenset


我们可以用id()方法来进行描述。

对于integer来说,开辟了新的内存空间

>>> a = 1  
>>> id(a)  
22862960  
>>> a = 2  
>>> id(a)  
22862948  

>>> a = 1  
>>> b = a  
>>> b += 1  
>>> a  
1  
>>> b  
2  


对于list来说,并没有开辟新的内存空间

>>> a = [1, 2]  
>>> b = a  
>>> b += [3]  
>>> a  
[1, 2, 3]  
>>> b  
[1, 2, 3]  
>>> id(a)  
27814608  
>>> id(b)  
27814608  
>>>  



Python中所有的变量都是值的引用,也就是变量通过绑定的方式指向值。这里的不可变就是指的值的不可变。对于不可变类型的变量,如果需要改变,则需要创建一个新值,把变量绑定在新值上。旧值没有引用就等待垃圾回收。

可变类型数据对象操作的时候,不需要再申请内存,只需要在对象后面(+/-)增减就可以。


一般情况下,程序员自定义的python类型都是mutable的,但是如果像定制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__(self, value):  
         super(Immutable, self).__setattr__("value", value) 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值