【问题标题】:Which are the advantages of byte objects over string objects in Python?Python中字节对象相对于字符串对象有哪些优势?
【发布时间】:2021-08-24 09:05:56
【问题描述】:

我了解 Python 中字节/字节数组和字符串之间的区别以及如何处理/操作/转换这些对象,但我找不到您更愿意在代码中使用字节而不是字符串的现实生活场景/示例。

在 Python 中字节对象相对于字符串对象有哪些优势? 以及在哪些现实生活场景中应该将代码字符串转换为字节?为什么?

【问题讨论】:

  • bytes 用于处理原始字节...str 用于处理文本。在早期的编程语言中,实际上在 Python 2 中,字符串只是“字节字符串”。但在多字节编码的 utf-8 字符串的世界中,最好有两种不同的专用类型。

标签: python python-3.x string byte


【解决方案1】:

您应该在哪些现实生活场景中将代码字符串转换为字节?为什么?

一个例子是使用一些适用于bytes 而不是str 的压缩算法。看看lzma built-in module examples,注意它确实适用于bytes,而不是str。在大量文本的情况下,这可以更有效地使用可用内存(即将相同的文本保存在更小的空间中)。

【讨论】:

    【解决方案2】:

    对于所有现代计算机架构,一个字节由 8 位组成,因此可以编码 256 个不同的值。

    在 ASCII 字符编码中,只有 128 个不同的值,其中只有一部分是可打印的。使用 UTF-8 会稍微复杂一些,但您最终会遇到类似的问题,即并非所有字节序列都可以表示为字符串。所以任何时候你有一个不能表示为字符串的字节序列,你必须使用bytes()bytearray

    您可能需要使用字节的一个示例是,在使用加密和伪随机序列生成时,您通常会得到一个不能以一对一的方式表示为字符串的字节序列。这是因为您希望在生成伪随机数和序列时使用尽可能大的输出空间。例如,参见标准库中的 secrets.token_bytes

    如果您想将这样的序列表示为字符串,可以将其编码为全部在 ASCII 编码空间内的字节序列,但当然是以使用更多字节为代价的。例如,您可以将其编码为十六进制字符或 base64。 Hex 的优点是生成的字符串的大小始终为2 * n_bytes,而 base64 是将字节编码为 ASCII 的最有效方式,即它将使用最少的额外字节。请注意,秘密标准库模块还为您提供了为您进行此转换的便利功能。

    【讨论】:

    • 再举一个例子。每当您需要将非文本文件的内容读入内存(如 png 图像)时,您不能将其作为字符串读取,因为该文件可能包含不可表示的字节。因此,在这种情况下,您将以二进制模式 open('file.png', 'rb') 打开文件并改为读取字节对象。
    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 2018-04-13
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    相关资源
    最近更新 更多