代码块,小数据池

id is == 代码块

id

变量存储在内存中是有一个唯一的内存地址的,定义一个变量就是在内存空间中开辟一个空间

  • 如何获取对象的内存ID?
num = 123
msg = "abc"
print(id(num))
print(id(msg))

#字符串的内存ID是随机的,如果ID相同,那么就是同一个

ID相同,值一定相同

值相同,ID不一定相同

==

== : 比较的是两边的值是否相等

s1 = [1,2,3]
s2 = [1,2,3]
print(s1 == s2)

is

is : 判断的是内存地址是否相同

s1 = [1,2,3]
s2 = [1,2,3]
print(s1 is s2)
#s1 s2在内存中创建了2个

s1 = "abc"
s2 = "abc"
print(s1 is s2)
#s1 s2在内存中是同一个


代码块

python程序时由代码块构造的,块是一个python程序的文本,作为一个单元执行的。

  • 代码块:一个文件,一个函数,一个模块,一个类,终端中一行就是一个代码块
  • 交互方式输入的每行命令都是一个代码块

缓存机制

代码块

  • 前提条件:在同一个代码块内,版本3.6及以下
  • 机制内容:python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在 ,会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会现在字典中查询记录,如果有同样的记录,那么他会重复使用这个字典中的之前的这个值。满足缓存机制则在内存中只存在一个。
  • 好处:节省内存,提高效率
  • 使用对象:int(float),str,bool
  • 对象的具体细则:
    • int(float):>= -5 的数字在同一代码块下都是复用的
    • bool:True和False在字典中会以1,0的方式存在,并且复用
    • str:几乎所有的字符串都符合缓存机制:
      • 非乘法得到的字符串都满足缓存机制(共用一个内存空间)
        • 乘数>=2时,满足仅含大小写字母,数字,下划线,总长度<=20内存地址相同
        • 乘数为1 时,任何字符串都满足代码块的缓存机制
        • 中文,特舒符号 乘法的时候只能乘以1或 0

小数据池

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

小数据池的验证方法:必须脱离代码块才可以

  • 前提条件:在不同代码块之间,版本3.6及以下
  • 数字
    • 范围:-5~256内满足缓存机制
  • 字符串
    • 字符串的长度为0 或 1 ,默认符合驻留机制(小数据池)
    • 字符串长度>1,且只含有大小写字母,数字,下划线时才会默认驻留
    • 用乘法得到字符串
      • 乘数为1 :
        • 仅含大小写字母,数字,下划线,默认驻留
        • 含有其他字符,长度<=1,默认驻留
        • 含有其他字符,长度>1,默认驻留
      • 乘数 >=2时:
        • 仅含大小写字母,数字,下划线时,总长度<=20,默认驻留
  • 布尔值
    • True和False在字典中会以1,0的方式存在,并且复用

小结

如果在统一代码块下,采用统一代码块的缓存机制

不同代码块则采用小数据流的驻留机制

原文地址:https://www.cnblogs.com/os-linux/p/11197801.html