Python 的 bytes 对象也叫字符串吗?

5 投票
2 回答
533 浏览
提问于 2025-04-16 23:25

这是来自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及以上版本开始为这个变化做准备,把 bytesstr 视为同义词。

你应该把这个问题反馈给开发者(除非这个问题已经被修复了 - 我这边只有3.1.2版本)。我觉得这个表述可能需要改进一下。

6

在Python 2和3中,str既用来表示字符字符串,也用来表示字节。实际上,在Python 2.6之前,甚至没有单独的bytes类型(而在2.6和2.7中,bytes就是str)。

在hashlib文档中提到的不一致性,正是这个历史背景造成的。

撰写回答