Python PEP 3137将bytearray
引入为可变的8位数组类型。但是,list
类型的bytes
实现了相同的目标,实际上有better performance,尽管可能是一种笨拙的语法。这种新类型与Zen of Python
应该有一个 - 最好只有一个 - 显而易见的方法。
所以我的问题是:在bytearray
list
bytes
上使用bytearray
是否有任何记录的主要优势或设计考虑因素?
到目前为止,我还没有在PEP或文档页面中找到一条动机。实际上,文档将它们视为接近等于:
bytearray类型是0 <= x <0的范围内的可变整数序列。它有大多数可变序列的常用方法......
然后,
List和bytearray对象支持允许对象进行就地修改的其他操作。其他可变序列类型(当添加到语言中时)也应该支持这些操作。
由于bytearray
是静态类型的(作为8位无符号整数),人们可能会期望性能提高,但如上所述,反转可能是正确的。此外,对于list
bytes
itertools.chain
,{{1}}应该没有内存优势。我可以想象需要一种{{1}}式的可变类型,但这在任何地方都没有提及,似乎不是设计目标。
答案 0 :(得分:0)
首先,一个list
样式的容器,用于可以无缝迭代它们的对象序列(实际上itertools.chain
提供的东西)看起来很方便。正如PEP 3137提到的那样,array module可能已经为此目的服务,但“远非理想”。
作者希望“可变字节类型和不可变字节类型”,这可能意味着设计目标对于可变的(可能使用非连续内存进行快速插入和删除)具有相同的接口,以及作为一个不可变(绝对连续的内存)实现。据我所知,这创建了一系列混乱的序列类型,包括array.array
,bytes
,bytearray
,str
,unicode
,{{1 },list
和tuple
。实质上,它们为静态类型或鸭子类型,可变或不可变序列提供接口,这些序列存储在存储器中或在运行中进行评估(生成器)。其中大多数都遵循Abstract Base Classes的基本原理,但我认为在将其视为Pythonic之前还有更多的设计要做。
注意:我打开这个答案进行编辑,希望人们可以提供见解或更正。