代码块与缓存机制
Posted peiziming
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码块与缓存机制相关的知识,希望对你有一定的参考价值。
## `id` `is` 与 `==`
1.需要区分`is`与`==`的区别,需要借助`id`来实现。
计算机在存储数据的时候,都会在内存里开辟一个空间。可以想象为酒店的房间号,
是该数据第一无二的标识,这个标识就是`id`。比如创建一个变量`A = 123`,可
以通过`id(A)`来查变量A的内存地址,通过查找它的`id`是`140711580377728`。
这里注意,没运行一次代码,内存都会随机变化,但在单独的一次中它的`id`是唯一
的。就相当于你每次办理酒店入住,房间号都是随机选的,但哪个房间号该酒店是唯一
的。
2.`is`与`id`
python中使用逻辑比较符is来判断两元素是否源于同一引用,即是否地址相同。
```
A = 123
B = 123
print(A is B) #True
print(id(A) == id(B)) #True
```
当is判断返回为True时,表示两元素是同一个对象,位于同一内存中。
3.`==`与`id`
python使用==来表示数值是否相等。
```
A = 2
B = 6 / 3
print(A == B) #True
print(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)
```
采用驻留机制的好处时节省内存,效率高。
以上是关于代码块与缓存机制的主要内容,如果未能解决你的问题,请参考以下文章