今天同事问了我一个问题,关于Python中的可变类型与不可变类型。之前我只知道Python中有可变类型与不可变类型,至少我知道数字型是不可变类型的。今天就趁着这个机会把这个问题彻底搞清楚。
Python的数据类型大致可以分成数字型,字符型,列表型,元组型和字典型。其中,数字型,字符型和元组型是不可变类型,其他两种类型列表型和字典型是可变类型。下面就通过几个例子来说明什么是可变类型和不可变类型。
首先还是看最简单的数字型,我们定义i = 10。
从上面运行的结果可以看出,虽然i = i + 1,但是i的内存地址已经发生变化。事实上并没有改变原来i的值,只是又另外建立了一个i的地址。也就是说在31486528L这个内存地址所存放的数据的类型是不能改变的,而且其值也不能发生改变。当这个地址的值不再使用时,该内存地址被释放掉。当i的值发生变化后,则i的内存地址也发生变化,即int是不可变类型。
如果另一个变量的值也是10,则i,j的值相同,指向同一内存地址,这也是Python比较有意思的地方。
下面我们看看浮点型是什么情况。
从上面可以看到,浮点型的数据和int型的数据情况差不多,只是两个值相同的浮点型并没有指向同一块内存。这是因为python
只对整型和短字符串进行了缓存,对float型和长字符串并没有进行缓存。
下面我们来看看可变类型,以list为例
li是一个list型,初始值是[1, 2, 3]。此时li的内存地址是40238855L。但是当li的值发生变化,变成[1, 2, 3, 4]时,这个时候li
的内存地址还是40238855L。即内存地址40238855L所存放的值是可变的。
对于可变类型,还有一个需要注意的。当使用赋值语句“=”把两个可变类型“连接”在一起后,他们就指向了同一块内存地址。
由于它是可变类型,则两个变量会指向同一个内存地址。当其中一个变量发生变化后,另一个变量也会发生变化。
a_list和b_list的值是相等的,但是由于list是可变类型,因此他们的内存地址并没有指向同一块内存地址。如果使用赋值语句
可以把两个list变量的内存地址变成是一样的,但是要注意当a_list的值发生变化后,b_list值也会跟着发生变化。
以上就是今天的博客内容。
与您共勉!