Подтвердить что ты не робот

Почему я получаю int при индексировании байтов?

Я пытаюсь получить первый char байтовой строки в 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'

Может кто-нибудь объяснить, почему это происходит?

4b9b3361

Ответ 1

Тип bytes - это Тип двоичной последовательности и явно документирован как содержащий последовательность целых чисел в диапазоне от 0 до 255.

Из документации:

Объекты Bytes являются неизменяемыми последовательностями одиночных байтов.

[...]

В то время как байтовые литералы и представления основаны на тексте ASCII, объекты байтов фактически ведут себя как неизменные последовательности целых чисел, причем каждое значение в последовательности ограничено таким, что 0 <= x < 256 [.]

[...]

Поскольку объекты байтов являются последовательностями целых чисел (сродни кортежу), для объекта байта b, b[0] будет целым числом, а b[0:1] будет bytes объект длины 1. (Это контрастирует с текстовыми строками, где индексирование и нарезка будут вызывать строку длиной 1).

Смелый акцент мой. Обратите внимание, что индексирование строки является немного исключением среди типов последовательностей; 'abc'[0] предоставляет объект str длиной один; str - это единственный тип последовательности, который всегда содержит элементы своего типа.

Это повторяет, как другие языки обрабатывают строковые данные; в C тип unsigned char также является целым числом в диапазоне 0-255. Многие компиляторы C по умолчанию используют unsigned, если вы используете неквалифицированный тип char, а текст моделируется как массив char[].