Python学习笔记(二)——Python中的可变与不可变类型

什么是可变类型

其中的“可变”指的是内存地址的变化

内存地址:当我们对一个变量赋值时,程序会给这个变量分配一小块空间以存储该变量的信息,这个空间的地址即该变量的内存地址

如果把一个变量比作一个人,那么内存地址就是这个人的身份证号码

在python中,我们可以用 id()函数获得一个变量的内存地址

a=1
id(a)
1511766480

我们试着把 a 的值改变,然后观察 id(a)的变化

a=a+1
id(a)
1511766512

我们知道如果 a 的值(例如1)是储存在 a 的地址 1511766480 中的话,那么 a 的值的变化不应该会影响到 a 的内存地址,
这说明 a 的值不是储存在 a 的地址中,相反的,1 这个值的地址是固定的, 1511766480 这个地址属于 1 而不是变量 a 的,是 a 的指针指向了 1 的地址。

其实,在python中:

  1. 对不可变类型的变量进行修改实际上是对其重新赋值;

  2. = 并不是复制,而是将变量指向另一个变量的值的内存地址。所以需要复制可变类型的变量时,请勿使用 =

通过下面一个测试可以验证我们的结论:

b=1
id(b)
1511766480

访问 b 得到的地址与 a 的一样

如果能在固定一个变量的地址时,改变该变量的值,那么就说其属于可变类型

我们可以把变量的值看作这个人的财富值,变量的类型就是人的类型

有些类型的人是守财奴,跟着钱走,如果你要把他的钱转到B的名下,他就也跟着把自己的身份证号改成B的,这种葛朗台就是不可变类型,冥顽至极

有些类型的人就看得开些,钱变就变吧,我还是我,他就属于可变类型

由于葛朗台占了多数,我们就只说哪些是可变类型吧

可变类型只有: list, dict

b=[1,2,3,'h']
id(b)
1930908238472
b.append('5')
print(b)
print(id(b))
[1, 2, 3, 'h', '5']
1930908238472

看到了嘛,b 变化后的地址不变,这意味着什么呢?

c=b
print(c)
[1, 2, 3, 'h', '5']
b.append('hh')
print(c)
print(id(c))
[1, 2, 3, 'h', '5', 'hh']
1930908238472

我去,c 的值居然也跟着 b 一起变了,真是防不胜防,那么如果我们不想让 c 跟着 b 变,有什么办法呢?
办法还是有的

b=b+['cc']
print(b)
print(id(b))
print(c)
print(id(c))
[1, 2, 3, 'h', '5', 'hh', 'cc']
1930908174856
[1, 2, 3, 'h', '5', 'hh']
1930908238472

看到了吧,c 的地址没变,值也没变,反倒是 b 的地址随着值变动了,看来在适当的方法下,不贪财的人也会变成葛朗台

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值