小数据池


a=5 b=5 print(a is b) c=-7 d=-7 print(c is d) e=300 f=300 print(e is f)

  这个代码在python命令行和py文件执行的结果不一样。

  Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象。

  如果是不同的代码块,他就会看这个两个变量是否是满足小数据池的数据,如果是满足小数据池的数据则会指向同一个地址。所以:i1、i2赋值语句分别被当作两个代码块执行,但是他们不满足小数据池的数据所以会得到两个不同的对象,因而is判断返回False。

对于数字:-5至256是会被加到小数据池中的,每次使用都是同一个对象
对于字符串:
1、如果字符串的长度是0或者1,都是默认进行缓存
2、字符串长度大于1,但是字符串只有包含字母,数字,下划线时才会缓存
3、用乘法得到字符串,
    一、乘数为1,仅包含数字,字母,下划线时会被缓存,如果包含其他字符而长度<=1也会被驻存。
    二、乘数大于1,仅包含数字,字母,下划线这个时候会被缓存,但字符串长度不能大于20.
4、指定著驻留,我们可以通过sys模块中intern()函数来指定要驻留的内容。
5、bool全部缓存
#当前实现保留了一个整数对象数组当你在-5和256之间创建一个整数时,你实际上值返回对现有对象的引用

# 小数据池,一种数据缓存机制,也被称为驻留机制,各大编程语言中都有类似的东西,小数据池都是值的同一个对象

# 小数据池值针对:整数,字符串,布尔值,其他数据类型不存在驻留机制
Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。

python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。

其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。

优点:能够提高一些字符串,整数处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘池’里拿来用,避免频繁的创建和销毁,提升效率,节约内存。

缺点:在‘池’中创建或插入字符串,整数时,会花费更多的时间。
原文地址:https://www.cnblogs.com/Xingtxx/p/9748943.html