python机制与小数据池

python机制

  1. id is ==
    • 在Python中,id是什么?id是内存地址,那就有人问了,什么是内存地址呢? 你只要创建一个数据(对象)那么都会在内存中开辟一个空间,将这个数据临时加在到内存中,那么这个空间是有一个唯一标识的,就好比是身份证号,标识这个空间的叫做内存地址,也就是这个数据(对象)的id,那么你可以利用id()去获取这个数据的内存地址:
      name = '太白'
      print(id(name)) # 1585831283968

    • 那么 is 是什么? == 又是什么?
      == 是比较的两边的数值是否相等,而 is 是比较的两边的内存地址是否相等。 如果内存地址相等,那么这两边其实是指向同一个内存地址。

    • 可以说如果内存地址相同,那么值肯定相同,但是如果值相同,内存地址不一定相同

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