Python为何能直接将bytes对象转换为float?运行疑问解析
Question
我编写了如下代码片段:
#!/usr/bin/env python3 print(float(b'5'))
在UTF-8编码的Linux环境中运行时,该代码无报错并输出5.0。我对此感到困惑,因为按常理Python无法知晓bytes对象的编码方式,为何不会报错?希望得到相关解析。
Answer
这是个很有意思的问题!其实这里的关键在于Python内置的float()函数对bytes对象的处理逻辑,和你担心的“编码未知”问题其实不是一回事~
当你把bytes(或bytearray)对象传入float()时,Python会自动执行两个步骤:
- 默认使用UTF-8编码将bytes解码为字符串——这是Python数值转换函数(包括
int()、float())的内置规则,不需要你显式指定编码; - 把解码后的字符串转换成浮点数。
你的例子里,b'5'这个bytes对象在UTF-8编码下解码后就是字符串'5',而'5'可以正常转换成浮点数5.0,所以整个过程没有报错。
你可以做几个小实验验证这个逻辑:
- 试试
float(b'5.99'),会输出5.99,因为解码后的'5.99'是合法的浮点数格式; - 但如果传入包含非ASCII且无法转成数值的bytes,比如
float(b'\xe6\x97\xa5')(UTF-8编码的“日”字),就会抛出ValueError: could not convert string to float: '日'; - 要是传入的bytes本身不符合UTF-8编码规则,比如
float(b'\xff'),则会直接抛出UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte。
另外,int()函数也遵循同样的逻辑,比如int(b'1234')会返回1234,本质也是先解码再转数值。
总结一下:Python不是“不知道bytes的编码”,而是它默认用UTF-8来解码传入数值转换函数的bytes对象,刚好你的bytes内容在UTF-8解码后是合法的数值字符串,所以顺利完成了转换。如果bytes解码失败,或者解码后的字符串无法转成浮点数,就会触发对应的错误啦。
内容的提问来源于stack exchange,提问作者static_rtti
相关产品推荐
相关产品推荐

