Python可变和不可变数据类型有何特点
Admin 2022-08-11 群英技术资讯 368 次浏览
不可变数据类型在第一次声明赋值声明的时候, 会在内存中开辟一块空间, 用来存放这个变量被赋的值, 而这个变量实际上存储的, 并不是被赋予的这个值, 而是存放这个值所在空间的内存地址, 通过这个地址, 变量就可以在内存中取出数据了. 所谓不可变就是说, 我们不能改变这个数据在内存中的值, 所以当我们改变这个变量的赋值时, 只是在内存中重新开辟了一块空间, 将这一条新的数据存放在这一个新的内存地址里, 而原来的那个变量就不在引用原数据的内存地址而转为引用新数据的内存地址了.
举例子:
>>> x = 18 >>> id(x) 4497811200 >>> id(18) 4497811200 >>> x = 19 >>> id(x) 4497811232 >>> id(18) 4497811200 >>> y = 18 >>> id(y) 4497811200 >>>
一开始x = 18,开辟一块地址为4497811200的内存,即18对应的地址为4497811200,后来x = 19 ,重新开辟一块地址为4497811232的内存来放19,可以看到不变的意思是指18,和19在内存中的地址不会改变,将18赋值给y时,y指向的地址即为4497811200。
结合不可变数据类型,可变数据类型就很好理解来,可变数据类型是指变量所指向的内存地址处的值是可以被改变的。
>>> x = [1,2,3] >>> id(x) 4501838920 >>> y = [1,2,3] >>> z = [1,2,3] >>> id(y) 4501838600 >>> id(z) 4501838664
从另外一个角度来看:
可变类型:当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型。
可变数据类型:当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型。
#a的值改变了,a对应的内存地址也改变了 >>> a=1 >>> id(a) 4497810656 >>> a = 2 >>> id(2) 4497810688 #直接对a操作,相当于拷贝了一份a的值,在其他内存地址操作,a的值不变 >>> a+1 3 >>> id(a) 4497810688 >>> a 2 #b的值改变了,b对应的内存地址不变,第一次给b赋值的时候,给b划分一块内存空间,该空间就不变了 >>> b = [1,2,3] >>> id(b) 4501839496 #直接对b操作,b的值改变,b指向的内存空间不变 >>> b.append(4) >>> id(b) 4501839496 >>> b [1, 2, 3, 4] >>>
不可变:Number(数字)、String(字符串)、Tuple(元组)。
#整型 a = 1 print(id(a), type(a)) a = 2 print(id(a), type(a)) # 4361254304 <class 'int'> # 4361254336 <class 'int'> #字符串 b = 'anne' print(id(b),type(b)) b = 'anne1995' print(id(b),type(b)) # 4363638744 <class 'str'> # 4363684784 <class 'str'> #元组 c1 = ['1','2'] c = (1,2,c1) print(c,id(c),type(c)) c1[1] = 'djx' print(c,id(c),type(c)) # (1, 2, ['1', '2']) 4363948248 <class 'tuple'> # (1, 2, ['1', 'djx']) 4363948248 <class 'tuple'>
可以变:Set(集合)、List(列表)、Dictionary(字典)。
#集合 s = {1, 'd', '34', '1', 1} print(s, type(s), id(s)) s.add('djx') print(s, type(s), id(s)) # {1, '1', 'd', '34'} <class 'set'> 4401385256 # {1, '1', '34', 'd', 'djx'} <class 'set'> 4401385256 #列表 list = [1,'q','qwer',True] print(list,type(list),id(list)) list.append('djx') print(list,type(list),id(list)) # [1, 'q', 'qwer', True] <class 'list'> 4401113608 # [1, 'q', 'qwer', True, 'djx'] <class 'list'> 4401113608 #字典 tuple = (1) dic = {1:2} d = { tuple:1,'key2':'djx','key3':'li'} print(d,type(d),id(d)) d['key4'] = 'haha' print(d,type(d),id(d)) # {1: 1, 'key2': 'djx', 'key3': 'li'} <class 'dict'> 4401075976 # {1: 1, 'key2': 'djx', 'key3': 'li', 'key4': 'haha'} <class 'dict'> 4401075976
注意:此时元组的值发生了变化而内存地址没变,但我们依然称元组为不可变类型,为什么呢?其实改的是元组中的列表,列表是可变类型,改变了值后地址依然不变。但是元组的定义就是不可变的,
元组被称为只读列表,即数据可以被查询,但不能被修改。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
下面是列表合并的4种方法,其中的代码都在Python3下测试通过,在Python2下运行应该也没问题,时间关系就没测试,遇到问题可以去bbs pythont
在日常的python编程中使用这几个函数来简化我们的编程工作,经常使用能使编程效率大大地提高。本文为大家总结了六个Python编程最受用的内置函数,感兴趣的可以了解一下
本文主要介绍了使用pyscript在网页中撰写Python程式的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,下面这篇文章主要给大家介绍了关于利用PyCharm创建Django项目的简单步骤,需要的朋友可以参考下
由于学习需要安装matplotlib库,阅读网上教程后一直出现各种各样的错误,下面这篇文章主要给大家介绍了关于python3.7安装matplotlib失败问题的完美解决方法,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008