【问题标题】:Why do I get an int when I index bytes?为什么我在索引字节时会得到一个 int?
【发布时间】:2015-03-30 17:42:33
【问题描述】:

我试图在 python 3.4 中获取字节字符串的第一个字符,但是当我索引它时,我得到一个 int:

>>> my_bytes = b'just a byte string'
b'just a byte string'
>>> my_bytes[0]
106
>>> type(my_bytes[0])
<class 'int'>

这对我来说似乎不直观,因为我期望得到b'j'

我发现我可以得到我期望的价值,但对我来说这就像一个黑客攻击。

>>> my_bytes[0:1]
b'j'

谁能解释一下为什么会这样?

【问题讨论】:

  • 使用像my_bytes[0:1] 这样的范围真的帮助我编写了Python2/Python3 兼容的代码。我很想看到一个涵盖解决此问题的兼容代码的最佳实践的答案。例如:ord(my_bytes[0]) 在 Python2 中给出一个 int,而my_bytes[0] 在 Python3 中给出一个 int。为了同时工作,我使用了ord(my_bytes[0:1]),这对于 Python3 来说真的很难看。
  • 你的回答对我有帮助,我找不到使用字节的最佳方法并在访问索引时避免整数转换,谢谢。
  • 我注意到由 bytearray 和 bytestring 组成的列表存在同样的现象。 type(list(b'abctest').pop(0))&lt;class 'int'&gt;type(list(bytearray(b'abctest')).pop(0))&lt;class 'int'&gt;type(bytearray(b'abctest').pop(0))&lt;class 'int'&gt;.

标签: python python-3.x


【解决方案1】:

bytes 类型是 Binary Sequence type,并明确记录为包含 0 到 255 范围内的整数序列。

来自文档:

Bytes 对象是不可变的单字节序列。

[...]

虽然 bytes 文字和表示基于 ASCII 文本,但 bytes 对象实际上表现得像不可变的整数序列,序列中的每个值都受到限制,使得 0 &lt;= x &lt; 256[.]

[...]

由于字节对象是整数序列(类似于元组),对于字节对象bb[0] 将是一个整数,而b[0:1] 将是一个bytes长度为 1 的对象。(这与文本字符串形成对比,其中索引和切片都会产生长度为 1 的字符串)。

我的大胆强调。请注意,索引字符串在序列类型中有点例外。 'abc'[0] 给你一个长度为 1 的 str 对象; str 是唯一包含自己类型元素的序列类型,始终如此。

这与其他语言处理字符串数据的方式相呼应;在 C 中,unsigned char type 实际上也是 0-255 范围内的整数。如果您使用不合格的 char 类型,许多 C 编译器默认为 unsigned,并且文本被建模为 char[] 数组。

【讨论】:

  • "而 b[0:1] 将是长度为 1 的字节对象(这与文本字符串形成对比,其中索引和切片都会产生长度为 1 的字符串)"你能解释一下吗句子我没听懂?
  • @CY5:对不起,你得到了什么?如果您创建 (Unicode) 字符串,'abc'[0]' 会生成另一个字符串对象 'a'。如果您使用与 bytes 对象的示例相同的切片,'abc'[0:1] 也会生成长度为 1 的字符串对象 'a'
  • @CY5: 但对于bytes 对象,b'abc'[0] 产生一个整数 (97),切片产生一个长度为 1 的 bytes 对象(b'abc'[0:1] 产生 b'a' )。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 2012-10-17
相关资源
最近更新 更多