详解python的变量缓存机制


Posted in Python onJanuary 24, 2021

变量的缓存机制

变量的缓存机制(以下内容仅对python3.6.x版本负责)

机制

只要有两个值相同,就只开辟一个空间

为什么要有这样的机制

在计算机的硬件当中,内存是最重要的配置之一,直接关系到程序的运行速度和流畅度。在过去计算机内存资源昂贵而小的年代中,程序的内存管理成为编程中的重要技术之一。python没有C/C++中的指针那样的定义可以编程者自主的控制内存的分配,而是有一套自动的内存地址分配和缓存机制。在这个机制当中,可以把一些相同值的变量在内存中指向同一块区域,而不再重新开辟一个空间,这样就达到了节省内存的目的。

详解python的变量缓存机制
详解python的变量缓存机制

python中使用id()函数查看数据的内存地址

number部分

整型

对于整型而言,-5~~正无穷的范围内的相同值的id地址一致

# 在后续的版本中所有的数的id地址都一致

# 相同
print(id(9999999), id(9999999))
print(id(100), id(100))
print(id(-5), id(-5))

# 不同
print(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))

容器部分

字符串

字符串在相同的情况下,地址相同

# 相同
print(id('hello '), id("hello "))

# 不同
print(id('msr'), id('wxd'))

字符串配合使*号使用有特殊的情况:

乘数为1:只要数据相同,地址就是相同的

# 等于1,和正常的情况下是一样的,只要值相同地址就是一样的
a = 'hello ' * 1
b = 'hello ' * 1
print(a is b)
a = '祖国' * 1
b = '祖国' * 1
print(a is b)

乘数大于1:只有仅包含数字、字母、下划线时地址是相同的,而且字符串的长度不能大于20

# 纯数字字母下划线,且长度不大于20
a = '_70th' * 3
b = '_70th' * 3
c = '_70th_70th_70th'
print(a, id(a), len(a))
print(b, id(b), len(b))
print(c, id(c), len(c))
print(a is b is c)
'''
结果:
_70th_70th_70th 1734096389168 15
_70th_70th_70th 1734096389168 15
_70th_70th_70th 1734096389168 15
True
'''
# 纯数字字母下划线,长度大于20
a = 'motherland_70th' * 3
b = 'motherland_70th' * 3
c = 'motherland_70thmotherland_70thmotherland_70th'
print(a, id(a), len(a))
print(b, id(b), len(b))
print(c, id(c), len(c))
print(a is b is c)
'''
结果:
motherland_70thmotherland_70thmotherland_70th 2281801354864 45
motherland_70thmotherland_70thmotherland_70th 2281801354960 45
motherland_70thmotherland_70thmotherland_70th 2281801354768 45
False
'''
# 有其它字符,且长度不大于20
a = '你好' * 3
b = '你好' * 3
c = '你好你好你好'
print(a, id(a), len(a))
print(b, id(b), len(b))
print(c, id(c), len(c))
print(a is b is c)
'''
结果:
你好你好你好 3115902573360 6
你好你好你好 3115902573448 6
你好你好你好 3115900671904 6
False
'''

字符串指定驻留

使用sys模块中的intern函数,让变量指向同一个地址,只要字符串的值是相同的,无论字符的类型、长度、变量的数量,都指向同一个内存地址。

语法:intern(string)

from sys import intern

a = intern('祖国70华诞: my 70th birthday of the motherland' * 1000)
b = intern('祖国70华诞: my 70th birthday of the motherland' * 1000)
c = intern('祖国70华诞: my 70th birthday of the motherland' * 1000)
d = intern('祖国70华诞: my 70th birthday of the motherland' * 1000)
e = intern('祖国70华诞: my 70th birthday of the motherland' * 1000)

print(a is b is c is d is e)

元组

元组只有为空的情况下,地址相同

# 相同
print(id(()), id(tuple()))

# 不同
print(id((1, 2)), id((1, 2)))

列表、集合、字典

任何情况下,地址都不会相同

# 列表、非空元组、集合、字典 无论在声明情况下,id表示都不会相同

# 不同
print(id([]), id([]))
print(id(set()), id(set()))
print(id({}), id({}))

总结

# -->Number 部分
1.对于整型而言,-5~正无穷范围内的相同值 id一致
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一致,两个变量的值都同时指向一个值的地址,节省空间。

# 现在我们打开两个终端,进入python环境中,然后执行下面的指令,你会发现,只有-5 ~ 256范围内的整型的id值相同,而不是之前说过的是-5 ~ 正无穷的范围,这是因为,两个终端环境就相当于两个python文件或者是模块。

print(id(1000))
print(id(500))
print(id(257))
print(id(256))
print(id(-5))
print(id(-6))

详解python的变量缓存机制

其它

布尔、None这些类型都是有效的

# 开启两个终端测试吧
print(id(True))
print(id(False))
print(id(None))

详解python的变量缓存机制

到此这篇关于python的变量缓存机制的文章就介绍到这了,更多相关python的变量缓存机制内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
对于Python异常处理慎用“except:pass”建议
Apr 02 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 Python
快速了解python leveldb
Jan 18 Python
Python实现统计给定字符串中重复模式最高子串功能示例
May 16 Python
Python requests发送post请求的一些疑点
May 20 Python
numpy返回array中元素的index方法
Jun 27 Python
python绘制简单彩虹图
Nov 19 Python
Django网络框架之HelloDjango项目创建教程
Jun 06 Python
Python使用sklearn实现的各种回归算法示例
Jul 04 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
Oct 18 Python
python中@property和property函数常见使用方法示例
Oct 21 Python
python实现输入的数据在地图上生成热力图效果
Dec 06 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
Jan 23 #Python
利用Python函数实现一个万历表完整示例
Jan 23 #Python
python将YUV420P文件转PNG图片格式的两种方法
Jan 22 #Python
如何使用Python进行PDF图片识别OCR
Jan 22 #Python
详解pandas映射与数据转换
Jan 22 #Python
python实现简单的井字棋游戏(gui界面)
Jan 22 #Python
Django url 路由匹配过程详解
Jan 22 #Python
You might like
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
php递归删除目录与文件的方法
2015/01/30 PHP
php封装的验证码工具类完整实例
2016/10/19 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
2017/05/20 PHP
js模拟点击事件实现代码
2012/11/06 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
jQuery动态改变多行文本框高度的方法
2016/09/07 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
jQuery网页定位导航特效实现方法
2016/12/19 Javascript
JavaScript中的call和apply的用途以及区别
2017/01/11 Javascript
Bootstrap组合上、下拉框简单实现代码
2017/03/06 Javascript
vue实现页面加载动画效果
2017/09/19 Javascript
AngularJS中下拉框的高级用法示例
2017/10/11 Javascript
ReactNative实现Toast的示例
2017/12/31 Javascript
使用 Vue 绑定单个或多个 Class 名的实例代码
2018/01/08 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
2019/05/21 Javascript
JS实现瀑布流效果
2020/03/07 Javascript
python基础教程之循环介绍
2014/08/29 Python
python删除列表内容
2015/08/04 Python
Pandas中把dataframe转成array的方法
2018/04/13 Python
django 消息框架 message使用详解
2019/07/22 Python
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
django实现支付宝支付实例讲解
2019/10/17 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
Python web如何在IIS发布应用过程解析
2020/05/27 Python
Python实现LR1文法的完整实例代码
2020/10/25 Python
请说出这段代码执行后a和b的值分别是多少
2015/03/28 面试题
低碳环保演讲稿
2014/08/28 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
队列队形口号
2015/12/25 职场文书
商业计划书格式、范文
2019/03/21 职场文书
Python 文本滚动播放器的实现代码
2021/04/25 Python