python机制
- id is ==
-
在Python中,id是什么?id是内存地址,那就有人问了,什么是内存地址呢? 你只要创建一个数据(对象)那么都会在内存中开辟一个空间,将这个数据临时加在到内存中,那么这个空间是有一个唯一标识的,就好比是身份证号,标识这个空间的叫做内存地址,也就是这个数据(对象)的id,那么你可以利用id()去获取这个数据的内存地址:
name = '太白'
print(id(name)) # 1585831283968 -
那么 is 是什么? == 又是什么?
== 是比较的两边的数值是否相等,而 is 是比较的两边的内存地址是否相等。 如果内存地址相等,那么这两边其实是指向同一个内存地址。 -
可以说如果内存地址相同,那么值肯定相同,但是如果值相同,内存地址不一定相同
-
- 代码块
- 代码块:我们所有的代码都需要依赖代码块执行
- 一个文件就是一个代码块(函数除外)
- 交互式命令下一行就是一个代码块
- 两个机制(字符串驻留机制):同一个代码块下,有一个机制.不同的代码块下,遵循另一个机制。
- 同一代码块下缓存机制
- 前提条件:同一代码块内.
- 机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id相同 。
- 适用对象:int str bool
- 具体细则:所有的数字,几乎所有的字符串
- 优点:提升性能,节省内存。
- 不同代码块下的缓存机制:小数据池
- 前提条件:不同代码块内。
- 机制内容:Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。
python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。
其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。 - 适用对象:int str bool
- 具体细则:
- int:那么大家都知道对于整数来说,小数据池的范围是-5~256 ,如果多个变量都是指向同一个(在这个范围内的)数字,他们在内存中指向的都是一个内存地址
- str:字符串要从下面这几个大方向讨论(了解即可!):
- 字符串的长度为0或者1,默认都采用了驻留机制(小数据池)。
- 字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留。
- 用乘法得到的字符串,分两种情况。
- 乘数为1时
- 仅含大小写字母,数字,下划线,默认驻留
- 含其他字符,长度<=1,默认驻留
- 含其他字符,长度>1,默认驻留。
- 乘数>=2时:
- 仅含大小写字母,数字,下划线,总长度<=20,默认驻留
- 乘数为1时
- 指定驻留。
- 优点:提升性能,节省内存。