Python小数据池、代码块

一、id,is,==

id是内存地址,只要创建一个数据(对象)都会在内存中开辟一个空间,将这个数据临时加在到内存中,这个空间是一个唯一标识的。就好比是身份证号,标识这个空间的叫做内存地址,也就是这个数据(对象)的id。可以用id()去获取这个数据的内存地址:

name = '山药'
print(id(name))  # 1632311693224这个就是内存地址

== 是比较的两边的数值是否相等,而 is 是比较的两边的内存地址是否相等。 如果内存地址相等,那么两边数据其实是指向同一个内存地址。这个时候若内存地址内容发生改变,则两边的数据都会发生变化。内存地址相同,那么值肯定相同,但是如果值相同,内存地址不一定相同

id1 = 110
id2 = 110
print(id(id1))  # 1599502768
print(id(id2))  # 1599502768
print(id1 == id2)  # True 因为我使用的是PyCharm,在同一个文件中,即在同一个代码块中会触发缓存机制,\
# id2这个变量会去自动的引用内存中已有的数据110,所以id1,id2共用同一个数据,那么他们的id自然就会相同
print(id1 is id2)  # True

二、代码块

Python程序是由代码块构造的。块是一个python程序的文本,他是作为一个单元执行的。
代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块。而作为交互方式输入的每个命令都是一个代码块。
交互方式就是咱们在cmd中进入Python解释器里面,每一行代码都是一个代码块。而对于一个文件中的两个函数,也分别是两个不同的代码块

代码块的缓存机制

前提条件:在同一个代码块内。
机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象,满足缓存机制则他们在内存中只存在一个,即:id相同。
适用对象: int(float),str,bool。
int(float): 任何数字在同一代码块下都会复用。
bool: True和False在字典中会以1,0方式存在,并且复用。
str: 几乎所有的字符串都会符合缓存机制

三、小数据池

小数据池,不同代码块的缓存机制,也称为小整数缓存机制,或者称为驻留机制

前提条件:在不同一个代码块内。
机制内容:Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。
  python会将一定规则的字符串在
字符串驻留池
中创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。
  其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数和一定规则的字符串放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,那么他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。
适用对象int(float),str,bool

# 这是在cmd中的操作
>>> id1 = 200
>>> id2 = 200
>>> print(id(id1))
1599505648
>>> print(id(id2))
1599505648
>>> print(id1 is id2)  # 200没有超过256,所以id相同
True

# 来看看超过256的情况
>>> a = 500
>>> b = 500
>>> print(id(a))
2624868951152
>>> print(id(b))
2624868953840
>>> print(a is b)  #False
False

猜你喜欢

转载自blog.csdn.net/qq_44788449/article/details/107823448