show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 上次根据值比较的原理做了一些题目
- 同时发现了这么个问题
- 同样的代码
- id时等时不等
- 这怎么理解?🤔
- 问题主要出现在333上面
- 如果我用i1 给 i2 赋值
- 会如何呢?
- 直接赋值是没有问题的
- 因为把地址赋过去了
- id肯定是相等的
- 不过同样的代码
- 两个为什么123的地址都相同呢?
- 而且这两个地址位置有很大的(数量级)的差距
- 经过搜索
- int型的变量其实是一个封装的类型
- 比较小的数字经常用到
- 有一个类似于小数据池的地方
- 如果变量的值在小数据池里面
- 直接就指过去了
- 但是大数字呢?
- 大数字则不然
- 大数字也是变量
- 存储的位置是运行时动态分配的
- 两个数字分配到了两个地址
- 所以 id 不一样
- 同样是对于 int 的 is 判断
- 根据数字大小结果就不一样
- 可是多大的数字会进入这个小数据池呢?
- 小数值池的范围是[-5,256]
- 范围内的是会被加到⼩小数值池中的
- 每次使⽤用都是同⼀一个对象
- 一般来说建议数字类用 == 更明确
- 字符序列其实也有类似的缓冲池
- 一般来说字符序列和字符串序列也是用 == 更合适
- 而列表、元组、集合、字典 则比较灵活
- 用 is 判断是否指向同一个对象
- 用 == 判断值是否相等
- 字符串又如何呢?
- s1 和 s2 都是字符串
- 都指向同一个地址
- 为什么他们不指向不同的地址呢?
- 如果有100个字符串变量
- 都是"oeasy"
- 如果每一个都分配一个空间就太占用空间了
- 所以就都指向一个字符串变量
- 多一个指向这个地址的字符串变量
- 这个变量的引用数量就会+1
- 这种机制叫做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
- 就是我们俗称的啥也不是
- 哪里也不指向
- 但他其实是一个指向NoneType类型的变量
- 指向这个位置意味着
- 他啥也不指向😂
- 类似的还有么?
- 布尔型变量的指向
- 只有两个位置
- True
- False
-
True是一个bool型的对象
- 即使没有变量引用他
- 他也已经分配好了空间等待引用
- 他占28字节
- 地址是9488736
-
那False呢?
- False是一个bool型的对象
- 即使没有变量引用他
- 他也已经分配好了空间等待引用
- 他占24个字节
- 地址是9486304
- True、False、None
- 这三个是标准常量
- python为了节省空间
- 定义了小数据池
- 小数值池
- 字符串拘留所
- 常用对象
- 小数据池
- 在range(-5,256)范围内的变量
- 不用重新分配空间
- 直接就可以指过去
- 字符串拘留所
- 每个申请的字符串空间
- 都成为一个字典项
- 想申请新空间
- 先去查字典
- 标准常量
- None
- True
- False
- 关于变量、类型
- 还有什么好玩的么??🤔
- 下次再说 👋