当前位置: 首页 > 后端技术 > Python

Python的变量缓存机制

时间:2023-03-26 19:05:35 Python

变量缓存机制变量缓存机制(以下内容只负责python3.6.x版本)机制,只要有两个值相同,只开一个空格.为什么计算机中要有这样的机制呢?在硬件中,内存是最重要的配置之一,直接关系到程序的运行速度和流畅度。在过去的计算机内存资源昂贵且体积小的时代,程序内存管理成为编程中的重要技术之一。Python没有C/C++中指针的定义,让程序员可以自主控制内存分配,而是有一套自动的内存地址分配和缓存机制。在这种机制下,一些值相同的变量可以指向内存中的同一区域,而无需重新开辟一块空间,从而达到节省内存的目的。使用python中的id()函数查看数据的内存地址。整数类型的数字部分是整数类型。-5~~正无穷大范围内相同值的id地址是相同的。#在后续版本中,所有数字的id地址都一致#相同print(id(9999999),id(9999999))print(id(100),id(100))print(id(-5),id(-5))#differentprint(id(-6),id(-6))浮点型对于浮点型,非负数范围内的相同值id相同#相同print(id(9999999.0),id(9999999.0))print(id(100.0),id(100.0))#??不同print(id(-5.0),id(-5.0))print(id(-6.0),id(-6.0))布尔值对于布尔值,当值相同时,id一致#相同print(id(True),id(True))print(id(False),id(False))复数和复数在(实数+虚数)这样的结构中永远不会相同,只有同一个虚数才会一致#相同print(id(1j),id(1j))print(id(0j),id(0j))#不同print(id(1234j),id(3456j))print(id(1+1j),id(1+1j))print(id(2+0j),id(2+0j))容器部分stringstring相同大小写,相同地址#相同print(id('hello'),id("hello"))#不同print(id('msr'),id('wxd'))字符串组合成*的使用有一个特例:乘数为1:只要数据相同,地址相同#等于1,一般情况下是一样的,只要数值相同,地址相同a='hello'*1b='hello'*1print(aisb)a='祖国'*1b='祖国'*1print(aisb)乘数大于1:地址只有只包含数字、字母、下划线,且字符串长度不能大于20时才相同#纯数字、字母、下划线,长度不大于20a='_70th'*3b='_70th'*3c='_70th_70th_70th'print(a,id(a),len(a))print(b,id(b),len(b))print(c,id(c),len(c))print(aisbisc)'''结果:_70th_70th_70th173409638916815_70th_70th_70th173409638916815_70th_70th_70th1734096389168',alengththan',15Truemotherland_70th'*3b='motherland_70th'*3c='motherland_70thmotherland_70thmotherland_70th'print(a,id(a),len(a))print(b,id(b),len(b))print(c,id(c),len(c))print(aisbisc)'''结果:motherland_70thmotherland_70thmotherland_70th228180135486445motherland_70thmotherland_70thmotherland_70th228180135496045motherland_70thmotherland_70thmotherland_70th228180135476845False'''#有其它字符,且长度不大于20a='你好'*3b='Hello'*3c='你好你好你好'print(a,id(a),len(a))print(b,id(b),len(b))print(c,id(c),len(c))print(aisbisc)'''result:hellohellohello31159025733606hellohellohello31159025734486hellohellohello31159006719046False'''字符串指定了sys模块中的intern函数让变量指向同一个地址。只要字符串的值相同,不管字符类型、长度、变量个数,都指向同一个内存地址。语法:intern(string)fromsysimportinterna=intern('祖国七十华诞:我祖国七十华诞'*1000)b=intern('祖国七十华诞:我祖国七十华诞'*1000)c=intern('祖国70华诞:我的祖国70华诞'*1000)d=intern('祖国70华诞:我的祖国70华诞'*1000)e=intern('祖国70华诞:我的祖国70华诞'*1000)print(aisbiscisdise)tuple元组只有当它为空时,地址相同#相同print(id(()),id(tuple()))#differentprint(id((1,2)),id((1,2)))不管怎样,列表、集合、字典的地址都不会是相同#对于列表、非空元组、集合和字典,id的意思不会相同#不同print(id([]),id([]))print(id(set()),id(set()))print(id({}),id({}))Summary#-->NumberPart1.对于整数,相同值的id在-5~正无穷大范围内是一致的。2、对于浮点数,非负数范围内id的相同值是一致的。3.布尔值和换句话说,在值相同的情况下,id是相同的4.复数在实数+虚数的结构中永远不会相同(只有虚数的情况是例外,只有虚数的虚数相同才有相同的id)#-->容器类型部分5.字符当字符串和空元组相同时,地址相同。6.列表、元组、字典、集合在任何情况下都有不同的ID【空元组除外】小数据池以下内容只负责python3.6.8数据在同一个文件(模块)之间,缓存机制变量存储如上所述。但如果是不同文件(模块)中的数据,部分数据会驻留在小数据池中。什么是小型数据池?不同python文件(模块)中的相同数据不应该在同一个内存地址,而应该开辟一个新的空间,但是这样会造成内存空间压力,所以python定义了小数据池的概念。默认情况下,即使一小部分数据在不同的文件中,只要数据相同,就可以使用相同的内存空间来节省内存。支持哪些类型的小型数据池?小数据池只对:int、bool、None关键字,这些数据类型有效。int对于int,python在内存中创建一个-5到256范围内的整数,预先驻留在内存的一块区域。如果是不同文件(模块)中的两个变量,声明相同的值在-5~256范围内,id相同,两个变量的值指向一个值在-5的地址同时,节省空间。#现在我们打开两个终端,进入python环境,然后执行下面的指令,你会发现只有-5~256范围内的整数有相同的id值,而不是之前说的-5~正无穷大这是因为两个终端环境相当于两个python文件或模块。print(id(1000))print(id(500))print(id(257))print(id(256))print(id(-5))print(id(-6))其他类型的Boolean和None全部有效#打开两个终端测试print(id(True))print(id(False))print(id(None))