代码块与小数据池之间的关系

Posted xiayuhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码块与小数据池之间的关系相关的知识,希望对你有一定的参考价值。

关于python代码块以及贮留机制

什么是代码块

python程序是由代码块构造的,代码块是一个python程序的文本,作为一个单元执行
一个模块(如time模块,就是一个.py文件),一个类,一个文件等都是一个代码块。
在交互式中输入的每一行命令都是一个代码块(cmd进入python解释器,每一行就是一个代码块)。对于一个文件中的两个函数,分别是不同的两个代码块。

id,is,==

在python中,id代表内存地址,
例如name = "summer"
id(name) 4324720512

这后面的一串数字,就是"summer"的内存地址,那么,如果内存地址相同的两个数,值肯定相同,== 表示的是数值之间的比较,is 是id之间的比较

小数据池

小数据池也称为小整数缓存机制,或者成为驻留机制

python中小数据池只针对整数、字符串、bool值

优点:提升效率,节省内存

int:在整数中,小数据池的范围是-5~256,如果多个变量只想范围内的同一个数字,那么它们在内存中都是指向同一个内存地址

str:1、字符串的长度为0或者为1,默认采用小数据池 2、当字符串的长度大于1且小于20,并且只含有大小写字母、数字、下划线是,默认采用小数据池; 3、指定驻留

from sys import intern
a = intern(‘[email protected]20)
b = intern(‘[email protected]
20)
print(a is b)
指定驻留是你可以指定任意的字符串加入到小数据池中,让其只在内存中创建一个对象,多个变量都是指向这一个字符串。

代码块与小数据池之间的关系

同样一段代码,为什么在交互方式中执行,和通过python代码的文件执行结果不同呢?

# pycharm 通过运行文件的方式执行下列代码:
i1 = 1000
i2 = 1000
print(i1 is i2) # 结果为True

通过交互方式中执行下面代码:
>>> i1 = 1000
>>> i2 = 1000
>>> print(i1 is i2)
False


上述结果的不同是因为代码块的缓存机制

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

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

对于同一个代码块的变量复用的问题,只能针对于数字,字符串,bool值,而对于其他数据类型是不成立的。

本文大量引用和参考链接如下:https://www.cnblogs.com/jin-xin/articles/9439483.html






















以上是关于代码块与小数据池之间的关系的主要内容,如果未能解决你的问题,请参考以下文章

前端学习 第二天 块与内嵌关系

java新建对象的static块与构造器的执行顺序

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

代码块与缓存机制

代码块与静态代码块与静态方法的加载顺序

Git 常见问题与小知识