第五篇 Python小数据池,代码块

833 阅读4分钟

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,那么他在内存中只存在一个。

  优点:能够提高一些字符串,整数处理任务在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从‘池’里拿来用,避免频繁的创建和销毁,提升效率,节约内存。