python 2.7和PEP-358中的字节类型

Ste*_*ini 29 python types

根据PEP 358,字节对象用于存储可变字节序列(0-255),如果不是这种情况则引发.

但是,我的python 2.7说不然

>>> bytes([1,2,3])
'[1, 2, 3]'
>>> bytes([280])
'[280]'
>>> bytes is str
True
>>> bytes
<type 'str'>
Run Code Online (Sandbox Code Playgroud)

有没有人知道PEP被宣布为最终的原因,但实施不符合?

nos*_*klo 48

bytes 类型唯一3.X.2.x bytes内置只是该str类型的别名.bytes2.x中没有新的类型; 只是一个新的别名和文字语法str.

这是每个人都喜欢的文档片段:

Python 2.6 bytes作为str类型的同义词添加,它也支持 b''表示法.

2.6 str以各种方式与3.0的字节类型不同; 最值得注意的是,构造函数完全不同.在3.0中,bytes([65, 66, 67]) 是3个元素长,包含表示的字节ABC; 在2.6中, bytes([65, 66, 67])返回表示str() 列表的12字节字符串.

bytes2.6中的主要用途是编写对象类型的测试,如isinstance(x, bytes).这将有助于2to3转换器,它无法判断2.x代码是否意图字符串包含字符或8位字节; 您现在可以使用bytesstr完全表示您的意图,并且在Python 3.0中生成的代码也是正确的.


Sco*_*ths 39

bytes类型是在Python 3中引入的,但是在PEP中讨论的是一个可变序列(bytes不可变),它在Python 2.6中以名称引入bytearray.

PEP显然没有按照规定实施(它确实说它被PEP 3137部分取代)但我认为这只是一个重新命名的问题,而不是缺失的功能.在Python 2中,bytes它只是一个str帮助向前兼容的别名,因此这里有一个红色的鲱鱼.

示例bytearray用法:

>>> a = bytearray([1,2,3])
>>> a[0] = 5
>>> a
bytearray(b'\x05\x02\x03')
Run Code Online (Sandbox Code Playgroud)