什么是字节数组?为什么使用它?

What is a bytearray? Why was it used?

我将在 CoderByte 练习中复习其他人的代码。我只是在复习第一个复习字符串的练习。

代码如下:

def FirstReverse(s): 
  ar = bytearray(s)
  ar.reverse()
  return str(ar) 
print FirstReverse("Argument goes here")

我在第一行之后打印了 ar 并刚刚取回了字符串,所以我不清楚 bytearray 有何帮助。我也是看了这里的文档还是没看懂:https://docs.python.org/2/library/functions.html#bytearray

那么什么是字节数组?在这个例子中使用它有意义吗?

我个人看不出它有什么帮助。您可以通过以 -1:

的步长对字符串进行切片来原生地使用字符串进行这种类型的反转
def FirstReverse(s):
    return s[::-1]
print FirstReverse("Argument goes here")

我使用 Python 2.7.10 对 bytearray 版本和这个版本进行计时,并没有发现一个比另一个更快。

所以我想这是一种不同的方法,但我不认为它是更好的方法。

我能看到的唯一优势是如果字符串是 unicode 并且您使用的是 Python 2.x 而不是 3.x(因为 Python 2.x字符串不是原生的 unicode)。但是,要将 unicode 字符串拉入 bytearray,您需要指定编码,这里没有这样做。所以一定不是为了这个目的。

正如doc所说,

Return a new array of bytes. ... is a mutable sequence of integers in the range 0 <= x < 256

例如,

 >>> s = 'hello world'
 >>> print bytearray(s) 
 hello world
 >>> bytearray(s)[0] 
 104

104h的ASCII码。

Class bytearray 有方法 reverse,但 string 没有。为了反转字符串,这段代码先获取其bytes数组,然后保留,最后通过str.

得到反转后的字符串

此外,您可以使用[::-1]反转字符串。

>>> 'Argument goes here'[::-1]
'ereh seog tnemugrA'

str and a bytearray 之间的区别在于 str 是一个 Unicode 代码点序列,而 bytearray 是一个字节序列。单个 Unicode 字符串可能由多个不同的 bytearrays 表示,具体取决于编码格式(例如,UTF-8 表示和相同 [的 UTF-16 表示会有不同的 bytearrays =10=]).另外,str是用来表示文字的;相比之下,bytearray 可用于表示根本不对应于文本的任意字节序列(例如,在任何标准编码格式中都不是有效 Unicode 的字节序列,实际上将被解释为某些内容与文本完全不同,例如整数序列、序列化对象、扩展精度整数或您希望表示为字节序列的任何其他内容。

除此区别外,str 是不可变的,而 bytearray 是可变的。这意味着对 str 的转换必须执行复制操作;相比之下,bytearray 的内容可以就地更新/修改。

在这个特定的例子中,确实没有理由使用 bytearray(事实上,这样做比使用 str 的反向切片更危险,因为 bytearray.reverse() 反转底层字节...对于由多个字节编码的字符,这可能会在解释回 Unicode 代码点时导致完全无效的 Unicode 序列)。但是,如果您想检查或操作字符串的编码形式或执行与原始文本完全无关的操作(例如填充数据报数据包的字节),那将是 bytearray.[ 的用例。 =26=]