为什么在索引字节时得到一个int?

mes*_*shy 20 python python-3.x

我试图在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'>
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎不直观,正如我期待的那样b'j'.

我发现我可以获得我期望的价值,但这对我来说感觉就像是一个黑客.

>>> my_bytes[0:1]
b'j'
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么会这样吗?

Mar*_*ers 18

bytes类型是二进制序列类型,并明确记录为包含0到255范围内的整数序列.

从文档:

字节对象是单个字节的不可变序列.

[...]

虽然字节文字和表示基于ASCII文本,但字节对象实际上表现为不可变的整数序列,序列中的每个值都被限制为0 <= x < 256[.]

[...]

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

大胆强调我的.注意,索引字符串在序列类型中有点异常; 'abc'[0]给你一个str长度为1 的物体; str是唯一一个包含自己类型元素的序列类型.

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

  • @CY5:但是对于`bytes`对象,`b'abc'[0]`产生一个整数(`97`),切片产生一个长度为1的`bytes`对象(`b'abc'[0:1 ]` 产生 `b'a'`)。 (2认同)