详解python的变量缓存机制
作者:小小垂髫 发布时间:2023-05-11 07:47:45
标签:python,变量,缓存
变量的缓存机制
变量的缓存机制(以下内容仅对python3.6.x版本负责)
机制
只要有两个值相同,就只开辟一个空间
为什么要有这样的机制
在计算机的硬件当中,内存是最重要的配置之一,直接关系到程序的运行速度和流畅度。在过去计算机内存资源昂贵而小的年代中,程序的内存管理成为编程中的重要技术之一。python没有C/C++中的指针那样的定义可以编程者自主的控制内存的分配,而是有一套自动的内存地址分配和缓存机制。在这个机制当中,可以把一些相同值的变量在内存中指向同一块区域,而不再重新开辟一个空间,这样就达到了节省内存的目的。
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({}))
来源:https://www.cnblogs.com/msr20666/archive/2021/01/23/14319386.html


猜你喜欢
- 1.JSONObject介绍JSONObject-lib包是一个beans,collections,maps,java arrays和xml
- 前言:我们在打印一些 PDF 文件的时候可能会遇见加密不能打印的情况,需要提供密码才能打印。如果直接在浏览器中浏览 PDF 文件,它不能调取
- 目录json支持的格式:代码操作1.json转化为python2. python序列化为json总结json转化为python表示反序列化p
- 作者: hezhiwu5@163.com <script language="javascr
- 问题背景:有一批需要处理的文件,对于每一个文件,都需要调用同一个函数进行处理,相当耗时。有没有加速的办法呢?当然有啦,比如说你将这些文件分成
- 一、数据库基础用法要先配置环境变量,然后cmd安装:pip install pymysql1、连接MySQL,并创建wzg库#引入decim
- 第一种方案、最简单、普通的方法:SELECT TOP 30 * FROM ARTICLE WHERE ID NOT IN(SELECT TO
- 利用OpenCV练习读取图片的时候,图片总是一闪而过,不利于观察,这个时候需要利用到waitKey函数。waitKey函数:用来等待按键,当
- 本文大纲os模块是Python标准库中一个重要的模块,里面提供了对目录和文件的一般常用操作。而Python另外一个标准库——shutil库,
- IE的for...in循环存在严重的缺陷,除了性能低下外,有许多属性不可遍历,著名有这三兄弟:constructor ,toString ,
- 这篇文章主要介绍了JavaScript switch语句使用方法简介,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 1. 关于 try.. finally..假如上帝用 python 为每一个来到世界的生物编写程序,那么除去中间过程的种种复杂实现,最不可避
- 本文实例分析了python动态性强类型用法。分享给大家供大家参考。具体如下:Python变量声明和定义与C#不同,Python在使用变量之前
- 作者:HelloGitHub-追梦人物文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库当博客上发布的文章越来越多时
- 在python用import或者from...import来导入相应的模块。模块其实就是一些函数和类的集合文件,它能实现一些相应的功能,当我
- 使用Python语句,读取Linux远端服务器上的文件打印到控制台的代码实现:下载包:paramikoimport paramiko#服务器
- 实例是具象化的类,它可以作为类访问所有静态绑定到类上的属性,包括类变量与方法,也可以作为实例访问动态绑定到实例上的属性。实例1:class
- asp禁止站外盗链,站外提交方法、以及asp判断星期几方法.防盗链,主要通过判断上一页面来源是否是本站来实现的,不是本站的链接就
- Q: I am working with Oracle database 8.1.7 and I have written a JAVA c
- OpenCV图像处理一、图像入门1.读取图像使用 cv.imread() 函数读取一张图像,图片应该在工作目录中,或者应该提供完整的图像路径