代码块与缓存机制

文山羊 2020-06-19

## `id` `is` 与 `==`1.需要区分`is`与`==`的区别,需要借助`id`来实现。计算机在存储数据的时候,都会在内存里开辟一个空间。可以想象为酒店的房间号,是该数据第一无二的标识,这个标识就是`id`。比如创建一个变量`A = 123`,可以通过`id(A)`来查变量A的内存地址,通过查找它的`id`是`140711580377728`。这里注意,没运行一次代码,内存都会随机变化,但在单独的一次中它的`id`是唯一的。就相当于你每次办理酒店入住,房间号都是随机选的,但哪个房间号该酒店是唯一的。2.`is`与`id`python中使用逻辑比较符is来判断两元素是否源于同一引用,即是否地址相同。```A = 123B = 123print(A is B) #Trueprint(id(A) == id(B)) #True```当is判断返回为True时,表示两元素是同一个对象,位于同一内存中。3.`==`与`id`python使用==来表示数值是否相等。```A = 2B = 6 / 3print(A == B) #Trueprint(id(A) == id(B)) #False```这里虽然数值大小相同,但A与B不位于同一变量。从上述介绍可以看到,is判断是否为同一引用,==判断数值是否相同。当is判断为True时,==也会为True,但==判断为True时,is不一定为True。## 代码块what is code block?代码块是程序的基本执行单元。可以是一条语句、一个函数、一个类、一个模块、一个文件。只要是执行时以整体的形式运行,就叫代码块。比如在交互式方式中,比如`python`的idle中运行代码,每一行就是一个代码块。`>>> A = 123`,因为每输入一行它边运行一行代码。但在IDE比如pycharm写一个函数运行```def add(m,n):    print(f‘{m} + {n} = {m + n}‘)add(1,2)```运行时,函数中的每条语句都会运行,相当于把函数整体作为一个文件而运行最终输出结果。这时,`add()`函数的真个定义与调用就是一个代码块。### 同一个代码块内的缓存机制python在执行同一个代码块的初始化对象时,如新建变量的时候。会先检查其值是否存在,如果存在会将其重用,也就是引用。具体实现是:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。```>>> A = 123>>> id(A)140711580377728>>> B = 123>>> id(B)140711580377728```从上述代码可以看到,变量A,B的值都是123,在查看变量B的id时发现与变量A的id一致。这里验证了缓存机制。这样做的好处是可以节省内存,避免重复创建。缓存机制使用的对象是:`int`、`float`、`str`、`bool`。特别的字符串有以下规定:    1.非乘法运算的字符串都满足代码块的缓存机制    2.乘法运算的字符串分两种情况        1.乘数为1时,任何条件字符串都满足        2.乘数>=2时,满足标识符且总长度<=20的字符串也满足  这样做的好处是可以节省内存,避免重复创建,提升效率。###  不同代码块的缓存机制--小数据池Python自动将-5~256的`整数`进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。适用对象: int(float),str,bool数字和bool类型很好理解,这里介绍以下字符串的机制:    1.字符串长度为0或1默认采用驻留机制。    2.字符串长度>1,只含有标识符内容,默认驻留    3.乘法:        1.乘数为1时            1.只含标识符内容的,默认驻留            2.含其他字符,长度为0或1,默认驻留            3.含其他字符默认,长度>1,默认驻留        2.乘数>=2时,只含标识符内容的,长度<=20,默认驻留    4.还可以指定驻留--将字符串驻留在小数据池中    ```    from sys import intern    a = intern(‘str‘ * 20)    ```采用驻留机制的好处时节省内存,效率高。

相关推荐