关于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('hello!@'20)
b = intern('hello!@'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值,而对于其他数据类型是不成立的。
注意
数字-5到256都在小数据池中,所有的正数都在同一个代码块中,id()地址相同,但是负数小于-5后,是重新开辟的内存空间,id()地址就不同了