A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 尹亮 于 2019-2-22 10:13 编辑

很多人对于小数据池理解出现偏差,甚至有些人叫小整数池等,现在整理一篇自己的理解,供大家参考,不对的地方留言我们讨论。

1、首先理解 is 和 == 的区别
        Python中的对象可以理解为包括以下几个要素:id(身份标识)、type(数据类型)、value(数据值),is和==的区别就是 is 比较的是数据的id值,也就意味着只要 a is b == True 的话,a和b指向的是同一个对象;==比较的是数据的value值。

2、代码块与代码块的缓存机制
        Python的代码是由块构成的,每一个类、函数、模块等都可以称为代码块,此处需要注意:Python交互模式的每一行均是一个代码块。
        Python在执行同一代码块的初始化对象的命令时,会检查其值是否已经存在,如果存在,会将其重用。也就是说遇到初始化对象的命令时,会将初始化的变量与值储存在一个字典中,遇到新的变量时,会去字典检索,如果之前初始化过,那么直接复用,注意:复用的对象在内存中只存在一个,id值相同。代码块的缓存机制适用范围:int(float)、str、bool

3、小数据池
        小数据池/驻留机制 是针对不同代码块之间的缓存机制,有点类似于全局的意思。
        对于整数:Python自动将 -5~256 的整数进行了缓存,当你用这些数据的时候,并不会重新创建对象,而是使用已经创建好的缓存对象。
        对于字符串:Python会将一定规则的字符串在字符串驻留池中创建一份,当字符串赋值给变量时候,并不会重新创建对象。

4、注意
同一代码块下采用代码块的缓存机制
不同代码块采用小数据池驻留机制
[Python] 纯文本查看 复制代码
a = 888
b = 888

print(id(a), id(b))  # id值相同
print(a is b)  # 结果为True

# 总计:此处使用代码块的缓存机制

[Python] 纯文本查看 复制代码
# 在交互模式下
In [1]: a = 256

In [2]: b = 256

In [3]: a is b
Out[3]: True

In [4]: c = 257

In [5]: d = 257

In [6]: c is d
Out[6]: False

# 总结:在交互模式下,每一行都是一个代码块,所以使用小数据缓存机制,整数的范围是 -5~256,由上可知,257并不在缓存池中 




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马