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)