变量的缓存机制

变量的缓存机制(以下内容仅对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({}))

总结

# -->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))

其它

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

# 开启两个终端测试吧

print(id(True))

print(id(False))

print(id(None))

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

python中集合变量_详解python的变量缓存机制相关推荐

  1. python中index函数_详解python中的index函数用法

    1.函数的创建 def fun(): #定义 print('hellow') #函数的执行代码 retrun 1 #返回值 fun() #执行函数 2.函数的参数 普通参数 :要按照顺序输入参数 de ...

  2. python中延时函数_详解python中实现延时回调普通函数

    这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 前言 ...

  3. python中byte类型_详解python string类型 bytes类型 bytearray类型

    搜索热词 一.python3对文本和二进制数据做了区分.文本是Unicode编码,str类型,用于显示.二进制类型是bytes类型,用于存储和传输.bytes是byte的序列,而str是unicode ...

  4. python中setattr用法_详解Python的hasattr() getattr() setattr() 函数使用方法

    hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False. 需要注意的是name要用括号括起来 ...

  5. 详解python中的用法_详解python中*号的用法

    1.表示乘号 2.表示倍数,例如: def T(msg,time=1): print((msg+' ')*time) T('hi',3) 打印结果(打印3次): hi hi hi 3.单个 * (1) ...

  6. python中递归函数写法_详解python中递归函数

    函数执行流程 def foo1(b,b1=3): print("foo1 called",b,b1) def foo2(c): foo3(c) print("foo2 c ...

  7. python中 的用法_详解python中@的用法

    python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,@function作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义). 代码1 结 ...

  8. 详解python中的用法_详解python中@的用法

    python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义). 代码1 def funa(d ...

  9. python中减法运算函数_详解 Python 的二元算术运算,为什么说减法只是语法糖?...

    原题 | Unravelling binary arithmetic operations in Python 作者 | Brett Cannon 译者 | 豌豆花下猫("Python猫&q ...

  10. python中列表概念_详解python列表

    python:列表1.序列(sequence) 1.1.基本概念 1.2.索引 1.3.实际运用 2.列表(list) 2.1. 列表的概念 2.2. 列表的使用 3.切片 3.1.切片的概念 3.2 ...

最新文章

  1. 如何理解和评价机器学习中的表达能力、训练难度和泛化性能
  2. 在Mac配置adb命令
  3. Spark-1.4.0集群搭建
  4. 通向架构师的道路(第四天)之Tomcat性能调优-让小猫飞奔
  5. TiFlash:并非另一个 T + 1 列存数据库
  6. u-boot移植随笔:继续使用svn进行版本控制(合并分支实例)
  7. 快速从入门到精通!mysql字符串截取前两位
  8. “形象代言人”与“抽风式管理”
  9. Ubuntu 15.04 或更新版 更新源/Ubuntu 15.04 Vivid Vervet更新源已可用
  10. 运维自动化之5 - 基于LVS实现4层负载均衡应用
  11. php asp网站本地调试,php/asp网站程序本地调试工具
  12. 第一次使用码云上传本地项目
  13. 关于eclipse发送桌面快捷方式后打不开的问题
  14. android 字体设置为中等粗细
  15. 实战项目:Boost搜索引擎
  16. RPA拾取界面元素方式
  17. rx6800和rtx3070ti选哪个
  18. 微支付基础:信任的成本
  19. GraalVM - 云原生时代的 Java 笔记
  20. springBoot 拦截器与过滤器

热门文章

  1. python使用ray框架改进原有代码,实现多进程与分布式
  2. Easyconnect mac版本下载地址
  3. lnmp mysql主从_LNMP linux下mysql主从复制 _好机友
  4. 服务器文件同步本站,服务器文件同步
  5. html 去文本框中的双引号_前端·HTML基础
  6. ubuntu mysql 连接_Ubuntu 配置MySQL远程连接
  7. 使用Maven把项目打包成可执行jar在Idea里
  8. MySQL增删改查基础知识
  9. JQuery实现ajax跨域
  10. EASYUI- EASYUI左移右移 GRID中值