来自官方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
?
答案 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
对象内部单个字节的唯一“纯”方法。