python中不可变数据类型有_【Python面试】 说说Python可变与不可变数据类型?

本文详细探讨了Python中的可变与不可变数据类型的区别。可变数据类型如列表,在操作时不会改变内存地址,仅修改内容;而不可变数据类型如整数,在赋值或操作后会改变内存地址,创建新对象。了解这些差异对于优化代码和理解Python内存管理至关重要。
摘要由CSDN通过智能技术生成

公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助!

小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。

废话不多说,开始今天的题目:

问:说说Python可变与不可变数据类型的区别?

答:Python中看可变与不可变数据类型,主要是看变量所指向的内存地址处的值是否会改变 。Python 的六种标准数据类型:数字、字符串、列表、元组、字典、集合。

不可变数据(3个):Number(数字)、String(字符串)、Tuple(元组)。

可变数据(3个):List(列表)、Dictionary(字典)、Set(集合)。213170974_2_2021011603583856_wm

下面分别来说说这两者的具体区别:

1、可变数据类型

可变数据类型:变量所指向的内存地址处的值是可以被改变的 。本文例子参考如下链接:

https://www.cnblogs.com/big-devil/p/7625898.html

使用可变数据类型中的列表 list 为例:>>>a = [1, 2, 3]>>>id(a)41568816  >>>a = [1, 2, 3]>>>id(a)41575088  >>>a.append(4)>>>id(a)41575088  >>>a += [2]>>>id(a)41575088  >>>a[1, 2, 3, 4, 2]从上面的程序中可以看出,进行两次a = [1, 2, 3]操作,两次a引用的地址值是不同的,也就是说其实创建了两个不同的对象,这一点明显不同于不可变数据类型,所以对于可变数据类型来说,具有同样值的对象是不同的对象,即在内存中保存了多个同样值的对象,地址值不同。接着我们对列表进行添加操作,分别a.append(4)和a += [2],发现这两个操作使得a引用的对象值变成了上面的最终结果,但是a引用的地址依旧是41575088,也就是说对a进行的操作不会改变a引用的地址值,只是在地址后面又扩充了新的地址,改变了地址里面存放的值。所以可变数据类型的意思就是说对一个变量进行操作时,其值是可变的,值的变化并不会引起新建对象,即地址是不会变的,只是地址中的内容变化了或者地址得到了扩充。

213170974_3_20210116035838230_wm

图1 python可变数据类型分析

2、不可变数据类型

不可变数据类型:变量所指向的内存地址处的值是不可以被改变。

使用不可变数据类型中的 int 为例:>>>x = 1  >>>id(x)31106520  >>>y = 1  >>>id(y)31106520  >>>x = 2  >>>id(x)31106508  >>>y = 2  >>>id(y)31106508  >>>z = y>>>id(z)31106508  >>>x += 2  >>>id(x)31106484上面这段程序,我们先来看x = 1和y = 1两个操作的结果,从上面的输出可以看到x和y在此时的地址值是一样的,也就是说x和y其实是引用了同一个对象,也就是说内存中对于1只占用了一个地址,而不管有多少个引用指向了它,都只有一个地址值,只是有一个引用计数会记录指向这个地址的引用到底有几个而已。当我们进行x = 2赋值时,发现x的地址值变了,虽然还是x这个引用,但是其地址值却变化了,后面的y = 2以及z = y,使得x、y和z都引用了同一个对象,即2,所以地址值都是一样的。当x和y都被赋值2后,1这个对象已经没有引用指向它了,所以1这个对象占用的内存,即31106520地址要被“垃圾回收”,即1这个对象在内存中已经不存在了。最后,x进行了加2的操作,所以创建了新的对象4,x引用了这个新的对象,而不再引用2这个对象。

213170974_4_20210116035838322_wm

图2 python不可变数据类型分析

如果对于参考答案有不认同的,大家可以在评论区指出和补充,欢迎留言!

更多题目:

关注小猿公众号,每天学习一道题

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值