python的可变类型与不可变类型

python的每个对象都分为可变和不可变两种类型,主要的核心类型中,数字,字符串,元组是不可变的,列表和字典是可变的。这里的可变与不可变是指内存中的那块内容的value是否可以被改变

1、不可变类型

以int为例,实际上i+=1,并不是在原有的int对象上加1,而是重新创建一个新的对象,i引用自这个新的对象
通过id(),可以查看该对象的内存地址。

#coding:utf8
i=5
print str(i)+'的内存地址为'+str(id(i))
i+=1
print str(i)+'的内存地址为'+str(id(i))

输出结果为

5的内存地址为6599176
6的内存地址为6599152

由此可见当执行i+=1的时候内存地址变化了,因为int是不可变类型。
在看下边例子:

#coding:utf8
i=5
print str(i)+'的内存地址为'+str(id(i))
j=5
print str(j)+'的内存地址为'+str(id(j))

结果为

5的内存地址为42775048
5的内存地址为42775048

对不可变类型int或者较短的字符串来说,无论你创建了多少个不可变类型,只要值相同,他们在内存中的地址都相同。

>>> j = 3.3
>>> id(j)
33294032
>>> i=3.3
>>> id(i)
33294008

声明两个相同值的浮点型变量,查看它们的id,发现它们并不是指向同个内存地址。

2、可变类型

以list为例:list在append之后,还是指向同个内存地址,因为list是可变类型,可以在原处修改。

#coding:utf8
a = [1, 2, 3]
print id(a)
a.append(4)
print id(a)

结果

44740040
44740040

当存在多个值相同的不可变类型变量时,看看它们是不是跟可变类型一样指向同个内存地址

#coding:utf8
a = [1, 2, 3]
print id(a)
b = [1, 2, 3]
print id(b)

结果

42839496
42706888

虽然a、b的值相同,但是指向的内存地址不同。我们也可以通过b = a 的赋值语句,让他们指向同个内存地址:

#coding:utf8
a = [1, 2, 3]
print id(a)
b = [1, 2, 3]
print id(b)
b=a
print id(b)

结果

43363784
43231176
43363784

因为a、b指向同个内存地址,而a、b的类型都是List,可变类型,对a、b任意一个List进行修改,都会影响另外一个List的值。

# coding:utf8
a = [1, 2, 3]
b = a
b.append(4)
print a
print id(a)
print id(b)

输出结果为

[1, 2, 3, 4]
45721544
45721544

b变量append(4),对a变量也是影响的。输出他们的内存地址,还是指向同个内存地址。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值