爱学习,爱生活,会学习,会生活,人生有百学网更精彩!
爱学习 | 爱生活

python中可变对象和不可变对象

发布于:百学网 2022-07-28

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 "", line 1, in

  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)部分图文转自网络,刊登本文仅为传播信息之用,绝不代表赞同其观点或担保其真实性。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系(底部邮箱),我们将及时更正、删除,谢谢

- END -
  • 相关文章