Python 的 bytes 对象也叫字符串吗?
这是来自Dive Into Python 3的一段关于字符串的内容:
在Python 3中,所有的字符串都是Unicode字符的序列。没有什么叫做用utf-8编码的Python字符串,也没有用CP-1252编码的Python字符串。“这个字符串是utf-8吗?”这个问题是不正确的。utf-8是一种把字符编码成字节序列的方法。如果你想把一个字符串转换成特定字符编码的字节序列,Python 3可以帮你做到这一点。如果你想把一串字节转换成字符串,Python 3也可以帮你。字节和字符是不同的;字节就是字节。字符是一种抽象的概念。字符串就是这些抽象概念的序列。
今天早些时候,我使用了hashlib
模块,并查看了md5
的帮助文本,上面写着:
返回一个新的MD5哈希对象;可选地用一个字符串初始化。
但是,它并不接受string
,而是接受bytes
对象。
也许我想得太多了,但如果帮助文本直接说应该使用bytes
,不是更清楚吗?还是说大家都把字符串和字节叫成一样的名字?
2 个回答
5
可能这个帮助信息是从Python2留下来的。
这是从Python2到Python3之间的一个大变化。
Python2 Python3 str bytes unicode str
Python2.6及以上版本开始为这个变化做准备,把 bytes
和 str
视为同义词。
你应该把这个问题反馈给开发者(除非这个问题已经被修复了 - 我这边只有3.1.2版本)。我觉得这个表述可能需要改进一下。
6
在Python 2和3中,str
既用来表示字符字符串,也用来表示字节。实际上,在Python 2.6之前,甚至没有单独的bytes
类型(而在2.6和2.7中,bytes就是str
)。
在hashlib文档中提到的不一致性,正是这个历史背景造成的。