为什么python将字节迭代为整数?

为什么python将字节迭代为整数?,python,int,byte,Python,Int,Byte,摘自官方Python: 由于bytes对象是整数序列(类似于元组),因此对于bytes对象b,b[0]将是整数,而b[0:1]将是长度为1的bytes对象 我很困惑设计者为什么选择这样做,因为byte只有8位,而int通常是32位 有人能解释一下为什么b[0]是int?谢谢大家! 编辑: 我尝试了以下实验: >>> import sys >>> b = bytes(100) >>> sys.getsizeof(b) 133 >>&

摘自官方Python:

由于bytes对象是整数序列(类似于元组),因此对于bytes对象b,b[0]将是整数,而b[0:1]将是长度为1的bytes对象

我很困惑设计者为什么选择这样做,因为
byte
只有8位,而
int
通常是32位

有人能解释一下为什么
b[0]
int
?谢谢大家!

编辑: 我尝试了以下实验:

>>> import sys
>>> b = bytes(100)
>>> sys.getsizeof(b)
133
>>> sys.getsizeof(list(b))
1008

似乎
字节
由内存中的字节表示;但问题仍然是,为什么将
字节
迭代为
int

一个字节可以表示为
int
低于2**8,或者低于256。这是为了便于字节对象字节的可编辑性

注意:创建字节对象时,将显示:

bytes(iterable_of_ints) -> bytes
这意味着一个字节对象只是许多整数,但已转换为编码字节

将字节对象视为整数列表。看看这个:

>>> l = [1, 36, 233]
>>> b = bytes(l)
>>> l[0]
1
>>> b[0]
1
>>> l[0:1]
[1]
>>> b[0:1]
b'\x01'

现在问为什么

还有什么方法可以表示字节?
字符串肯定会用一种编码表示许多字节,但如果它有不同的编码或未指定编码,则不会如此。
一个元组没有意义,因为它可以包含任何内容。这包括其他字符串、浮点数和一个字节不能表示的其他内容。
一个整数只代表一个字节,一个专门用于此目的的整数元组就可以了


因此,一个
int
s元组将构成一个
bytes
对象,一个
bytes
对象将能够被解码并编码成字符串以供使用。
int
将是在
字节
对象内表示单个字节的唯一“纯”方式。

a
字节
对象不存储
int
s。对
字节
对象进行索引或迭代会生成
int
s,但
字节
对象将字节存储为字节。整个
字节
对象只会产生一次对象开销

字节
对象中提取的单个字节与任何其他整数使用相同的整数类型表示,因为这样做没有意义。由于CPython存储小整数的规范副本,因此将字节存储为普通
int
的唯一成本是指针的成本

仅为此创建一个专用的
字节
类型,在标准的64位CPython构建中,每个
字节
对象仍将花费16字节的对象开销,加上数据的1字节,加上指针的8字节,与仅为
int
存储指针相比,净损失17字节。当然,您可以存储规范的
byte
对象,但与现有规范的
int
s相比,这仍然没有任何好处。另外,
byte
类型会给需要与
byte
交互的代码增加额外的复杂性


在CPython的数据模型中,要以比使用int更少的字节/字节存储字节,唯一的方法是使用压缩表示法,而压缩表示法就是
字节本身。

Python的整数无论如何都是任意精度的对象,而不是原语。很多小值都是内部的,所以没有太多的开销。Python没有
字节
类型,Python的
int
不是32位。另外,
字节
对象在物理上不包含
int
s。@user2357112谢谢,没有
byte
类型这一事实为我解释了作为整数的迭代。这不是问题所在。我对它做了一点修改。这算不算回答?不,OP知道这基本上是一个整数列表,但想知道为什么。那么,还有什么其他方式可以表示一个字节呢?一个字符串可以用一种编码表示许多字节,但如果它有不同的编码则不能。元组没有意义,因为它可以包含任何内容。一个整数只能代表一个,一个整数元组就可以了。我认为这应该能很好地回答这个问题。@是的,你最后的评论实际上回答了我的问题。我现在明白了。非常感谢。不管怎样,当我迭代或索引一个字节对象时,我通常关心实际的整数值。我记得有一个PEP添加了一个
iterbytes
方法来像
str
对象一样进行迭代,我相信还有一个等价的索引方法。不记得是怎么回事了