Part 1:Python语言核心 - 内建数据类型
Python 数据类型 - 内建数据类型基本类型 Python 运行时最底层、最稳定、最常被优化的一类对象。它们的共同点都是内建类型built-in types都是不可变对象immutable都有明确的 C 层实现都深度参与 Python 的执行优化先统一一个底层视角在 Python 里x 10不是“x 里存了 10”而是x ─────▶ PyObject(int, value10)所有基本类型对象都满足有id()内存身份有type()有引用计数由 Python 垃圾回收系统管理这点非常重要int / float / bool / None只是对象的不同形态。int任意精度整数Python 的int是“任意精度整数”。a 10 b 10**100不会溢出位数只受内存限制 对比 C / JavaC / Java32 / 64 位Python动态扩展int的底层特点存储的是二进制大整数每次“修改”都会创建新对象不可变小整数会被缓存优化a256b256aisb# True常见实现a257b257aisb# 可能 False 原因Python 为了性能对常用小整数做了对象复用int运算的执行模型a 1 a 1不是修改1而是创建新对象2a重新绑定到2float双精度浮点数Python 的float C 的double64 位IEEE 754 标准有精度误差0.1 0.2 0.3 # False 这不是 Python 的 bug而是浮点数的本质为什么会有精度误差因为0.1 → 二进制是无限循环小数Python只能截断存储。importdecimal decimal.Decimal(0.1)decimal.Decimal(0.2)认知重点float 是“近似值”金融、精确计算不要用 float十进制转二进制的原理在二进制中小数部分使用2⁻¹、2⁻²、2⁻³… 表示0.5十进制 0.1二进制因为1 × 2⁻¹ 0.50.25十进制 0.01二进制因为0 × 2⁻¹ 1 × 2⁻² 0.250.1十进制转二进制0.1 × 2 0.2 → 0 0.2 × 2 0.4 → 0 0.4 × 2 0.8 → 0 0.8 × 2 1.6 → 1 0.6 × 2 1.2 → 1 0.2 × 2 0.4 → 0 开始循环所以0.1十进制 0.000110011001100110011...无限循环二进制0.2十进制转二进制由于0.2 2 × 0.1所以二进制表示是0.0011001100110011...同样无限循环IEEE 754 双精度浮点数的存储限制Python 使用 IEEE 754 双精度浮点数64位1 位符号位11 位指数位52 位尾数位有效数字这意味着只能存储52 位二进制有效数字超出的部分会进行舍入rounding。# 真实存储值print(f{0.1:.55f})# 0.1000000000000000055511151231257827021181583404541015625print(f{0.2:.55f})# 0.2000000000000000111022302462515654042363166809082031250print(f{0.3:.55f})# 0.2999999999999999888977697537484345957636833190917968750误差累加后会越来越大。金融计算切忌使用 float首选 Python 的 Decimal 标准库模块。complex复数z 1 2j实部z.real虚部z.imag不支持大小比较(12j) (23j) # TypeError 原因数学上复数没有“大小”定义bool继承自intbool的真实身份issubclass(bool,int)# TrueTrue1# TrueFalse0# True 但Trueis1# False为什么bool继承int历史 实用主义逻辑运算可以直接参与数值计算sum([True, False, True]) 2真值判断非常重要bool(x)为 False 的情况00.00jNone[]{}这是控制流执行模型的一部分NoneType唯一的空对象None是什么None is None # 永远 TrueNone是一个单例对象类型是NoneTypeNone的设计意义表示“没有值”表示“尚未返回”表示“空占位”def f(): pass print(f()) # NoneNone ≠ 0 ≠ False ≠ “”为什么要用is Nonex None # 不推荐 x is None # 推荐原因None是单例is比较身份避免被重载__eq__基本类型的共同特征总结特性说明不可变修改 新对象内建C 层实现高度优化小整数缓存可哈希可作 dict key生命周期长常驻内存
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2425664.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!