可能存在断言失败的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>
答案 0 :(得分:5)
字节对象Python 3 documentation表示
字节对象实际上表现得像整数的不可变序列,序列中的每个值都被限制为0 <= x&lt; 256
bytearray
类型记录在Python 3和Python 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)
Since Python 3.0,Python语言参考指定:
bytes对象是不可变数组。这些项是8位字节,由0&lt; = x&lt;范围内的整数表示。 256。
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的字符串作为替代,对于最大字节大小(实际上是字符大小)也不会有任何保证,除非实现声明了它自己的一些保证。