详解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 调用DLL操作抄表机
Jan 12 Python
Python使用Matplotlib实现Logos设计代码
Dec 25 Python
Python实现修改IE注册表功能示例
May 10 Python
Python 单元测试(unittest)的使用小结
Nov 14 Python
PyCharm+PySpark远程调试的环境配置的方法
Nov 29 Python
Python和Go语言的区别总结
Feb 20 Python
详解用Python练习画个美队盾牌
Mar 23 Python
树莓派用python中的OpenCV输出USB摄像头画面
Jun 22 Python
简单介绍python封装的基本知识
Aug 10 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
python 使用递归的方式实现语义图片分割功能
Jul 16 Python
python中Django文件上传方法详解
Aug 05 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函数)
2006/10/09 PHP
PHP 采集程序原理分析篇
2010/03/05 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
php单态设计模式(单例模式)实例
2014/11/18 PHP
使用图灵api创建微信聊天机器人
2015/07/23 PHP
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
javascript学习笔记(六) Date 日期类型
2012/06/19 Javascript
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
快速入门Vue
2016/12/19 Javascript
JS中的phototype详解
2017/02/04 Javascript
nodejs中art-template模板语法的引入及冲突解决方案
2017/11/07 NodeJs
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
详解angular2 控制视图的封装模式
2018/12/27 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
Python多进程并发(multiprocessing)用法实例详解
2015/06/02 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
django-rest-framework 自定义swagger过程详解
2019/07/18 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
PyCharm中如何直接使用Anaconda已安装的库
2020/05/28 Python
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
HTML5之SVG 2D入门8—文档结构及相关元素总结
2013/01/30 HTML / CSS
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
大学系主任推荐信范文
2013/12/24 职场文书
基于JavaScript实现省市联动效果
2021/06/22 Javascript
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
Java tomcat手动配置servlet详解
2021/11/27 Java/Android