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

时间:2019-01-03 21:49:14

标签: python int byte

来自官方Python documentation

  

由于字节对象是整数序列(类似于元组),所以对于字节对象b,b [0]将是整数,而b [0:1]将是长度为1的字节对象。

我对为什么选择设计器感到困惑,因为byte只是8位,而int通常是32位。

有人可以解释b[0]int背后的原因吗?谢谢!

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

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

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

2 个答案:

答案 0 :(得分:2)

bytes对象不存储int。在bytes对象上建立索引或进行迭代会产生int,但是bytes对象将字节存储为字节。整个bytes对象只产生一次对象开销。

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

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

在CPython数据模型中以比每个int更少的字节存储字节的唯一方法是使用打包表示,而打包表示就是bytes本身。

答案 1 :(得分:-1)

字节可以用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元组也可以。

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