TL;DR
python2.6+ bytes
= python2.6+ str
= python3.x bytes
!= python3.x str
python2.6+ bytearray
= python3.x bytearray
python2.x unicode
= python3.x str
长篇回答
自 Python 3.x 以来,bytes
和 str
在 Python 中的意义已经发生了变化。
首先简单回答你的问题,在 Python 2.6 中,bytes(b"hi")
是一个不可变的字节数组(8位或八进制数)。因此,每个byte
的类型就是byte
,这与 Python 2.6+ 中的str
相同(但在 Python 3.x 中并非如此)。
bytearray(b"hi")
是一个可变的字节数组。但是当你查询它的类型时,它是一个int
,因为Python将bytearray
的每个元素表示为0-255范围内的整数(8位整数的所有可能值)。然而,bytes
数组的元素是该字节的ASCII值。
例如,在Python 2.6+中考虑:
>>> barr=bytearray(b'hi')
>>> bs=bytes(b'hi')
>>> barr[0]
104
>>> bs[0]
'h'
>>> chr(barr[0])
'h'
>>> bs[0]==chr(barr[0])
True
现在Python 3.x有了完全不同的故事。正如您所猜测的那样,在Python2.6+中,为什么
str
文字会意味着
byte
是很奇怪的。这个
答案解释了这个问题。
在Python 3.x中,
str
是Unicode文本(以前只是字节数组,注意Unicode和字节是两个完全不同的东西)。
bytearray
是一个
可变的字节数组,而
bytes
是一个
不可变的字节数组。它们都有几乎相同的功能。现在,如果我在Python 3.x中再次运行上面的代码,这就是结果。在
Python 3.x中。
>>> barr=bytearray(b'hi')
>>> bs=bytes(b'hi')
>>> barr[0]
104
>>> bs[0]
104
>>> bs[0]==barr[0]
True
bytes
和bytearray
在Python 3.x中是相同的,除了它们的可变性不同。
你可能会问:str
发生了什么?在Python 3中,str
被转换为Python 2中的unicode
类型,并且unicode
类型随后从Python 3中删除,因为它是多余的。
我想编写能够轻松转换到Python 3的代码。那么,在Python 3中情况是否相同?
这取决于你要做什么。你正在处理字节还是ASCII表示的字节?
如果你正在处理字节,那么我的建议是在Python 2中使用bytearray
,它在Python 3中也是相同的。但是,如果对你很重要,你会失去不可变性。
如果你在处理ASCII或文本,则在Python 2中将字符串表示为
u'hi'
,这在Python 3中具有相同的含义。在Python 2中,“u”具有特殊含义,它指示Python 2将字符串文字视为
unicode
类型。“u”在Python 3中没有意义,因为Python 3中所有字符串文字默认都是Unicode(在Python 3中令人困惑地称为
str
类型,在Python 2中称为
unicode
类型)。