Python中可变类型mutable和不可变immutable

Python中变量的内存存储和Java较相似,和C相差较大。Python的类型可分为两种:mutable和immutable,前者存放变量的那块内存不可变,后者可变。Python中的任何东西都是object,占用一定的内存,而Python中的变量名则像一个"指针",指向对应的一块内存空间。

2010-2-3 9-56-58.png

如上图所示,每个方框可看作一小块内存,每个方框分隔的左边和右边是捆绑在一起,一对一不能变的。

A、B演示的是Python中的变量名,它有一块内存存放它指向的"地址"。要查看变量a指向的地址,执行id(a)即可。

右边123456、123470演示的是Python中Object存放的情形。Python中的mutable和immutable就是指上图右边"存放Value"这一块的值能不能改变

Python中的数字、字符串、Tuple是immutable的,测试一下:

>>>a=1
>>>id(a)
>>>a+=1
>>>id(a)

运行结果是两个值不同的,即a做加法,不是像C语言一样对变量指向的内存操作加1,而是把变量a指向另一块存放2的内存。这就是immutable类型,字符串和Tuple都可以这样测试。所有immutable类型都可以作为Python中的键值,如Python中字典的键,因为immutable类型是不可以改变的,所以HASH之后的值不变。

Python中的List、Dict、类实例是immutable的,同样测试一下:

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

运行结果是两个值相同,即a指向的那块内存没变,而是那块内存里面的值变了。这就是mutable的意思了。

了解了mutable和immutable,来看个例子:

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

此时,a、b的值分别为多少呢?因为数字是immutable类型,所以b此时指向新的一内存块,其值为2. a还是指向原来的内存块。所以a值为1,b为2. 如果按C语言的方式去理解,就会认为a、b都指向同一块内存块(一开始确实这样),指向b+=1是操作该内存块(错了),导致a、b的值都为2.

如果这样,a、b的值又是多少呢?相信不难答出。

>>>a=[1]
>>>b=a
>>>b+=[1]

转载请注明:来自pugWoo's Life
本文地址:http://www.pugwoo.com/2010/02/3/python-mutable-immutable.html



0 条评论

我要留言