Skip to content

Latest commit

 

History

History
243 lines (182 loc) · 5.96 KB

130-531615-[专业选修]小数据池_小数值_字符串拘留所_标准常量.sy.md

File metadata and controls

243 lines (182 loc) · 5.96 KB
show version enable_checker
step
1.0
true

比较运算符

回忆

  • 上次研究了 is
  • is 判断是否相等
  • 具体用 == 还是 is 和变量类型相关
  • int、float、str 之类的相等判断最好用 == 和 !=
  • 容器类对象的比较可以灵活运用 is 或者 ==
  • is 为 True 代表两个东西 id 相等
    • 用的是同一个盒子
    • 在内存中占的是同一块空间
  • 我发现了这么个问题

图片描述

  • 同样的代码
    • id时等时不等
    • 这怎么理解?🤔
  • 问题主要出现在333上面

观察

图片描述

  • 如果我用i1 给 i2 赋值
  • 会如何呢?

赋值

图片描述

  • 直接赋值是没有问题的
  • 因为把地址赋过去了
  • id肯定是相等的

图片描述

  • 不过同样的代码
  • 两个为什么123的地址都相同呢?

再观察

图片描述

  • 而且这两个地址位置有很大的(数量级)的差距

原因

  • 经过搜索

图片描述

  • int型的变量其实是一个封装的类型
  • 比较小的数字经常用到
  • 有一个类似于小数据池的地方
  • 如果变量的值在小数据池里面
  • 直接就指过去了
  • 但是大数字呢?

大数字

图片描述

  • 大数字则不然
    • 大数字也是变量
    • 存储的位置是运行时动态分配的
    • 两个数字分配到了两个地址
    • 所以 id 不一样
  • 同样是对于 int 的 is 判断
  • 根据数字大小结果就不一样
  • 可是多大的数字会进入这个小数据池呢?

小数值池

图片描述

  • 小数值池的范围是[-5,256]
  • 范围内的是会被加到⼩小数值池中的
  • 每次使⽤用都是同⼀一个对象
  • 一般来说建议数字类用 == 更明确
  • 字符序列其实也有类似的缓冲池
  • 一般来说字符序列和字符串序列也是用 == 更合适
  • 而列表、元组、集合、字典 则比较灵活
    • 用 is 判断是否指向同一个对象
    • 用 == 判断值是否相等
  • 字符串又如何呢?

字符串

图片描述

  • s1 和 s2 都是字符串
  • 都指向同一个地址
  • 为什么他们不指向不同的地址呢?

重用

  • 如果有100个字符串变量
    • 都是"oeasy"
  • 如果每一个都分配一个空间就太占用空间了

图片描述

  • 所以就都指向一个字符串变量
  • 多一个指向这个地址的字符串变量
  • 这个变量的引用数量就会+1
  • 这种机制叫做intern

intern

图片描述

  • intern的本意是“限制在设定的范围内”
    • 也有拘禁的意思
  • 大概意思是说
    • 有申请过空间的字符串变量
      • 我都给拘禁到一个字典里面
    • 再有要申请的
      • 我先去字典里查
    • 拘着的
      • 就不用再申请空间了
      • 直接给他地址
      • 让他引用
    • 没拘着的
      • 就申请空间
      • 然后给拘起来
      • 拘到字典里

图片描述

  • 但如果曾经拘留过
  • 后来给释放了
  • 后来又给拘了
  • 这种怎么办?

二进宫

  • s1本来是"oeasy"
    • "oeasy"被拘了😭
  • 然后
    • s1变成了"o1z"
    • "o1z"被拘
    • "oeasy"被放了
  • 然后
    • s1变成了"oeasy"
    • "oeasy"又被拘了

图片描述

  • 不过拘留他的已经不是原来的地方了
  • 换了看守所
  • 如何才能保证他还是原来的拘留所呢?

多次引用

图片描述

  • s1、s2 都指向"oeasy"的拘留所
  • s1 指向了 "o1z"
    • 换了个新的拘留所
    • "oeasy"的被引用次数-1
    • "oeasy"所在的地址被引用的数量不为0
    • 因为 s2 仍然指向 "oeasy"
  • s1 再次指向 "oeasy"
    • "oeasy"的被引用次数+1
    • 还是那个拘留所

图片描述

  • 还有类似的引用位置么?

None

  • None
    • 就是我们俗称的啥也不是
    • 哪里也不指向
    • 但他其实是一个指向NoneType类型的变量
    • 指向这个位置意味着
    • 他啥也不指向😂

图片描述

  • 类似的还有么?

布尔型的变量的指向

  • 布尔型变量的指向
  • 只有两个位置
    • True
    • False

图片描述

  • True是一个bool型的对象

    • 即使没有变量引用他
    • 他也已经分配好了空间等待引用
    • 他占28字节
    • 地址是9488736
  • 那False呢?

False

图片描述

  • False是一个bool型的对象
    • 即使没有变量引用他
    • 他也已经分配好了空间等待引用
    • 他占24个字节
    • 地址是9486304
  • True、False、None
    • 这三个是标准常量

总结

  • python为了节省空间
  • 定义了小数据池
    • 小数值池
    • 字符串拘留所
    • 常用对象
  • 小数据池
    • 在range(-5,256)范围内的变量
    • 不用重新分配空间
    • 直接就可以指过去
  • 字符串拘留所
    • 每个申请的字符串空间
    • 都成为一个字典项
    • 想申请新空间
    • 先去查字典
  • 标准常量
    • None
    • True
    • False
  • 关于变量、类型
    • 还有什么好玩的么??🤔
  • 下次再说 👋