python中可变对象和不可变对象
我们都知道在python中一起都是对象,在这个基础上,python语言还区分了可变对象和不可变对象,不可变对象有包括int, float, bool, str,可变对象包括字典(dict), 集合(set), 元组(tuple), 列表(list),对于初学者而言,可变对象和不可变对象有什么区别,可能会导致一些困扰,在这篇文章中我们就重点说一下他们的不同。
我们先来个例子看一下:
>>> x = 1001
>>> x
1001
>>> x = 1002
>>> x
1002
从上面的代码结果看你可能会有很困惑,x值改变了呀,不是说整形不可变对象吗,我看x值变了呀,抱歉,你这么想是错误的,因为x只是创建的对象引用,这里并没有改变对象,而且创建了一个新对象,x又引用到了新对象上,要明白具体情况,这就需要用到我们之前文章提到的id()函数,id()函数可以显示这个对象的唯一标识,我们看一下这2个是不是具体有相同的标识符就可以了:
>>> x = 1001
>>> x
1001
>>> id(x)
2127754933936
>>>
>>> x = 1002
>>> x
1002
>>> id(x)
2127757136816
我们可以看到这是2个不同的唯一标识符,可以理解这是2个不同的对象,那可能要问,x指向了1002,那1001去哪里了?1001那也没去,只是没有对象的引用了,就是说无法被访问到了,根据python内部计数器原理,当一个对象引用为0的时候,会被自动回收掉,当然这都是python内部机制,都是自动运行的。
所以说整型就是不可变对象,当创建后就不可变化了。
我们再说一下可变对象,我们拿列表举例说明:
>>> mylist = [1,2,3]
>>> id(mylist)
2127754786120
>>> mylist[0] = 8
>>> mylist
[8, 2, 3]
>>> id(mylist)
2127754786120
从以上代码中可以看到,我们及时改变了列表的值,但列表的内存地址并没有变,也就是对象还是之前的对象,这就是可变对象,那这里我们修改了列表的值,那如果用append()方法添加值呢?会创建一个新的对象吗?我们看结果:
>>> mylist = [1,2,3]
>>> id(mylist)
2127749796872
>>> mylist.append(4)
>>> mylist
[1, 2, 3, 4]
>>> id(mylist)
2127749796872
>>>
>>> mylist.pop()
4
>>> mylist
[1, 2, 3]
>>> id(mylist)
2127749796872
从以上代码可以看到,我们对列表增加值,列表的唯一标识符没有改变,对应的我们移出某个值,同样内存地址不会发生改变,对象始终是一个,不会产生新的对象出来,这就是可变对象。
了解了可变和不可变对象,我们接下来说一下字典的key为什么不能是可变对象,假如我们定义个字典如下:
>>> d = {[1,2]:'a'}
Traceback (most recent call last):
File "
TypeError: unhashable type: 'list'
当用列表来当key的时候会直接报错,那为什么不能用列表来当key呢,那我们不如反过来想,假设python运行我们用列表来当key,我们定义字典如下:
>>> d = {[1,2,3]:'a', [1,2]:'b'}
那现在我们可以通过key[1,2,3]访问到了值a, 我们通过key[1,2]访问到了值b,因为列表是可变对象,那我们修改key[1,2]为[1,2,3], 如下:
>>> d = {[1,2,3]:'a', [1,2,3]:'b'}
那么问题就来了,现在2个key一样,当我用key[1,2,3]来获取值的时候,该返回a还是b的值呢?所以到这里就运行不下去了,所以字典的key必须是不可变类型,这样才能确定的得到该得到的值。
作者: Python运维技术 python运维技术
来源公众号:
python运维技术
本站(www.100xue.net)部分图文转自网络,刊登本文仅为传播信息之用,绝不代表赞同其观点或担保其真实性。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系(底部邮箱),我们将及时更正、删除,谢谢