什么是可变类型
其中的“可变”指的是内存地址的变化
内存地址:当我们对一个变量赋值时,程序会给这个变量分配一小块空间以存储该变量的信息,这个空间的地址即该变量的内存地址
如果把一个变量比作一个人,那么内存地址就是这个人的身份证号码
在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中:
对不可变类型的变量进行修改实际上是对其重新赋值;
'='并不是复制,而是将变量指向另一个变量的值的内存地址。所以需要复制可变类型的变量时,请勿使用‘=’;
通过下面一个测试可以验证我们的结论:
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 的地址随着值变动了,看来在适当的方法下,不贪财的人也会变成葛朗台