Python中的字节总是八位字节吗?

时间:2016-03-28 15:44:06

标签: python language-lawyer jython pypy micropython

可能存在断言失败的Python实现:

assert all(byte in range(256) for byte in any_bytes_object) # Python 3 semantics 
assert all(byte in range(256) for byte in map(ord, any_bytes_object)) # Python 2

POSIX specifies explicitly that CHAR_BIT == 8 (8 bits per byte)。 Python中有类似的保证吗?它是在某处记录的吗?

Python 2 reference says: "Characters represent (at least) 8-bit bytes."

如果没有定义bytes名称(在旧的Python版本上),例如,在Jython 2.5上,那么问题是关于str类型(字节串),即Python 2上的bytes = str。 / p>

3 个答案:

答案 0 :(得分:5)

字节对象Python 3 documentation表示

  

字节对象实际上表现得像整数的不可变序列,序列中的每个值都被限制为0 <= x&lt; 256

bytearray类型记录在Python 3Python 2

  

0 <= x <0的范围内的可变整数序列。 256

因此语言是在8位字节的假设下设计的。

Python 2数据模型部分说“至少”8位似乎只是Python 2文档与Python 3文档相比没有及时更新的地方之一。它的历史可以追溯到至少Python 1.4,早在他们不确定是否需要支持奇怪的字节大小的早期阶段。

由于2.0版本中至少引入了unicode支持,因此文档中充满了将bytestring类型称为“8位字符串”的地方。 Python没有像C这样严格指定,但我会说Python 2.0或更高版本的任何“符合”实现都必须有8位字节。

答案 1 :(得分:1)

除官方文档cited by user2357112外,我们还可以查阅引入bytes对象的Python增强提议。

指定了

PEP 358 -- The "bytes" Object

  

一个bytes对象存储一个可变的整数序列,范围在0到255之间。

我们知道字节对象最终不可变此规范不能完全适用和&#39;范围&#39;它的一部分可能也是没有意义的。

有趣的是,PEP 3137 -- Immutable Bytes and Mutable Buffer部分取代了PEP 358(并将字节指定为 immutable 并引入了bytearrays作为 mutable 等价物)仅指定了您可以< em>放入字节对象并放入bytearrays(&#34; int [eger] s in range(256)&#34;),但不是出来

PEP都没有提及&#34; bit&#34;或&#34;位&#34;一点都不(虽然我们从逐位布尔运算中知道Python整数如何映射到位模式,所以我希望不会有任何惊喜。)

答案 2 :(得分:1)

Python 3

Since Python 3.0,Python语言参考指定:

  

bytes对象是不可变数组。这些项是8位字节,由0&lt; = x&lt;范围内的整数表示。 256。

Python 2

Before that(即,直到Python 2.7),它指定(如问题中已经提到的):

  

字符串的项目是字符。 [...]字符代表(至少) 8位字节。

(强调补充。)

请注意,Python 2没有bytes个对象。为了在Python 2中保存字节块化二进制数据的不可变序列,通常使用字符串。 (相比之下,Python 3字符串仅用于文本数据,与Python 2的unicode对象相比,而不是Python 2字符串。)

但......

ord() function提及&#34; 8位字符串&#34;的Python 2文档并将它们与unicode对象进行对比。可能暗示所有非unicode Python-2字符串都是8位字符串,但我不会指望它。

结论

提供符合Python-3的bytes对象的Python实现将被限制为仅保存8位字节。符合Python 2的Python实现不受此约束(作为bytes对象,如果它具有一个,将是未指定的)并且如果您使用其符合Python-2的字符串作为替代,对于最大字节大小(实际上是字符大小)也不会有任何保证,除非实现声明了它自己的一些保证。