Python的可变类型与不可变类型

      今天同事问了我一个问题,关于Python中的可变类型与不可变类型。之前我只知道Python中有可变类型与不可变类型,至少我知道数字型是不可变类型的。今天就趁着这个机会把这个问题彻底搞清楚。

      Python的数据类型大致可以分成数字型,字符型,列表型,元组型和字典型。其中,数字型,字符型和元组型是不可变类型,其他两种类型列表型和字典型是可变类型。下面就通过几个例子来说明什么是可变类型和不可变类型。

      首先还是看最简单的数字型,我们定义i = 10。

[python]  view plain  copy
  1. >>>i = 10  
  2. >>>id(i)  
  3. 31486528L  
  4. >>>i = i + 1  
  5. >>>id(i)  
  6. 31486504L  
  7. >>>j = 10  
  8. >>>id(j)  
  9. 31486528L  
  10. >>>  
       从上面运行的结果可以看出,虽然i = i + 1,但是i的内存地址已经发生变化。事实上并没有改变原来i的值,只是又另外建立了一个i的地址。也就是说在31486528L这个内存地址所存放的数据的类型是不能改变的,而且其值也不能发生改变。当这个地址的值不再使用时,该内存地址被释放掉。当i的值发生变化后,则i的内存地址也发生变化,即int是不可变类型。

 如果另一个变量的值也是10,则i,j的值相同,指向同一内存地址,这也是Python比较有意思的地方。

 下面我们看看浮点型是什么情况。

[python]  view plain  copy
  1. >>>i = 1.2  
  2. >>>id(i)  
  3. 31547504L  
  4. >>>i = i + 1.3  
  5. >>>id(i)  
  6. 31547528L  
  7. >>>j = 1.2  
  8. >>>id(j)  
  9. 31547580L  
  10. >>>  
 从上面可以看到,浮点型的数据和int型的数据情况差不多,只是两个值相同的浮点型并没有指向同一块内存。这是因为python

只对整型和短字符串进行了缓存,对float型和长字符串并没有进行缓存。

下面我们来看看可变类型,以list为例

[python]  view plain  copy
  1. >>>li = [123]  
  2. >>>id(li)  
  3. 40238855L  
  4. >>>li.append(4)  
  5. >>>li  
  6. [1234]  
  7. >>>id(li)  
  8. 40238855L  
 li是一个list型,初始值是[1, 2, 3]。此时li的内存地址是40238855L。但是当li的值发生变化,变成[1, 2, 3, 4]时,这个时候li

的内存地址还是40238855L。即内存地址40238855L所存放的值是可变的。

对于可变类型,还有一个需要注意的。当使用赋值语句“=”把两个可变类型“连接”在一起后,他们就指向了同一块内存地址。

由于它是可变类型,则两个变量会指向同一个内存地址。当其中一个变量发生变化后,另一个变量也会发生变化。

[python]  view plain  copy
  1. >>>a_list = [123]  
  2. >>>b_list = [123]  
  3. >>>id(a_list)  
  4. 40238856L  
  5. >>>id(b_list)  
  6. 40793096L  
  7. >>>b_list = a_list  
  8. >>>id(b_list)  
  9. 40238856L  
  10. >>>a_list.append(4)  
  11. >>>b_list  
  12. [1234]  
 a_list和b_list的值是相等的,但是由于list是可变类型,因此他们的内存地址并没有指向同一块内存地址。如果使用赋值语句

可以把两个list变量的内存地址变成是一样的,但是要注意当a_list的值发生变化后,b_list值也会跟着发生变化。

以上就是今天的博客内容。

与您共勉!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值