前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Python面试】 说说Python可变与不可变数据类型?

【Python面试】 说说Python可变与不可变数据类型?

作者头像
小小詹同学
发布2019-12-09 16:37:24
1.1K0
发布2019-12-09 16:37:24
举报
文章被收录于专栏:小詹同学小詹同学

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

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

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

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

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

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

1、可变数据类型

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

本文例子参考如下链接: https://www.cnblogs.com/big-devil/p/7625898.html

使用可变数据类型中的列表 list 为例:

代码语言:javascript
复制
>>> 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引用的地址值,只是在地址后面又扩充了新的地址,改变了地址里面存放的值。

所以可变数据类型的意思就是说对一个变量进行操作时,其值是可变的,值的变化并不会引起新建对象,即地址是不会变的,只是地址中的内容变化了或者地址得到了扩充。

图1 python可变数据类型分析

2、不可变数据类型

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

使用不可变数据类型中的 int 为例:

代码语言:javascript
复制
>>> 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这个对象。

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小詹学Python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档