1、id,is,==
在Python中, 你只要创建一个数据(对象)就会在内存中开辟一个空间,这个空间是有一个唯一标识的,就好比是身份证号,标识这个空间的就叫做内存地址,也就是这个数据(对象)的id,那么你可以利用id()去获取这个数据的内存地址。
name = '张三'
print(id(name)) # 1797632349264
== 是比较的两边的数值是否相等(会调用对象的__eq__方法,获取这个方法的比较结果,如果没有重写,则默认比较依然是内存地址),而 is 是比较的两边的内存地址是否相等。 如果内存地址相等,那么这两边其实是指向同一个内存地址。
>>> a = 1000
>>> b = 1000
>>> print(a is b)
False
>>> print(a == b)
True
>>>
以上表明a和b数值相同,但是不是同一个内存地址,可以说如果内存地址相同,那么值肯定相同,但是如果值相同,内存地址不一定相同。
2、代码块
Python程序是由代码块构造的。块是一个python程序的文本,他是作为一个单元执行的。
代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块。
而作为交互方式,输入的每个命令都是一个代码块。
什么叫交互方式?就是在cmd中进入Python解释器里面,每一行代码都是一个代码块,例如:
>>> a = 1000
>>> b = 1000
而对于一个文件中的两个函数,也分别是两个不同的代码块:
def fun1():
pass
def fun2():
pass
2.1、代码块的缓存机制
前提条件:在同一个代码块内。
机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查其值是否已经存在,如果存在,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。
适用对象: int(float),str,bool。
对象的具体细则:(了解)
int(float):任何数字在同一代码块下都会复用。
bool:True和False在字典中会以1,0方式存在,并且复用。
str:几乎所有的字符串都会符合缓存机制,具体规定如下(了解即可! ):
1.非乘法得到的字符串都满足代码块的缓存机制:
s1 = '张三@!#*ewq'
s2 = '张三@!#*ewq'
print(s1 is s2) # True
2.乘法得到的字符串分两种情况:
2.1.乘数为1时,任何字符串满足代码块的缓存机制:
b1 = '张三@5847395QQ0743895*&^%$#((&_+(())' *1
a1 = '张三@5847395QQ0743895*&^%$#((&_+(())' *1
print(a1 is b1) # True
2.2.乘数>=2时:仅含大小写字母,数字,下划线,总长度<=20,满足代码块的缓存机制:
s1 = 'san_' * 5
s2 = 'san_' * 5
print(s1 is s2) # True
优点:能够提高一些字符串,整数处理,在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘字典’中取出复用,避免频繁的创建和销毁,提升效率,节约内存。
3、小数据池
前提条件 :在不同一个代码块内。
Python自动将-5~256的整数进行了缓存,当你将这些整数赋值给变量时,并不会重新创建对象,而是使用已经创建好的缓存对象。
python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会重新创建对象, 而是使用在字符串驻留池中创建好的对象。
适用对象: int(float),str,bool
对象的具体细则:(了解即可)
int:大家都知道对于整数来说,小数据池的范围是-5~256 ,如果多个变量都是指向同一个(在这个范围内的)数字,他们在内存中指向的都是一个内存地址。
>>> a = 100
>>> b = 100
>>> c = 100
>>> print(id(a),id(b),id(c))
2748060816848 2748060816848 2748060816848
那么对于字符串的规定呢?
str: 字符串要从下面这几个大方向讨论(了解即可! ):
1.字符串的长度为0或者1,默认都采用了驻留机制(小数据池)。
>>> a = '@'
>>> b = '@'
>>> print(a is b)
True
>>> s1 = ''
>>> s2 = ''
>>> print(s1 is s2)
True
2.字符串的长度>1,且只含有大小写字母,数字,下划线时,才会默认驻留。
>>> a = '@'
>>> b = '@'
>>> print(a is b)
True
>>> s1 = ''
>>> s2 = ''
>>> print(s1 is s2)
True
3.用乘法得到的字符串,分两种情况。
3.1.乘数为1时,任何字符串满足代码块的缓存机制
3.2.乘数>=2时:
仅含大小写字母,数字,下划线,总长度<=20,默认驻留。
>>> a = 'a2_' * 4
>>> b = 'a2_' * 4
>>> print(a is b)
True
>>> a = 'a2_@' * 4
>>> b = 'a2_@' * 4
>>> print(a is b)
False
4.指定驻留。
指定驻留是你可以指定任意的字符串加入到小数据池中,让其只在内存中创建一个对象,多个变量都是指向这一个字符串。
from sys import intern
a = intern('hello!@'*20)
b = intern('hello!@'*20)
print(a is b)
满足以上字符串的规则时,就符合小数据池的概念。
bool值就是True,False,无论你创建多少个变量指向True,False,那么他在内存中只存在一个。
优点:能够提高一些字符串,整数处理任务在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘池’里拿来用,避免频繁的创建和销毁,提升效率,节约内存。