байты против bytearray в Python 2.6 и 3

я экспериментирую с bytes vs bytearray в Python 2.6. Я не понимаю причины некоторых различий.

A bytes итератор возвращает строки:

for i in bytes(b"hi"):
    print(type(i))

выдает:

<type 'str'>
<type 'str'>

но bytearray итератор возвращает ints:

for i in bytearray(b"hi"):
    print(type(i))

выдает:

<type 'int'>
<type 'int'>

почему разница?

Я хотел бы написать код, который будет хорошо переводиться на Python 3. Итак, ситуация такая же в Python 3?

3 ответов


в Python 2.6 байт - это просто псевдоним для str.
Этот "псевдо-тип" был введен [частично] для подготовки программ [и программистов!] для преобразования / совместимости с Python 3.0, где существует строгое различие семантики и использования для str (которые систематически unicode) и байтов (которые являются массивами октетов, для хранения данных, но не текста)

аналогично префикс b для строковых литералов неэффективен в 2.6, но он является полезным маркером в программа, которая явно указывает на намерение программиста иметь строку как строку данных, а не текстовую строку. Эта информация может быть использована конвертером 2to3 или аналогичными утилитами, когда программа портирована на Py3k.

вы можете проверить это поэтому вопрос для получения дополнительной информации.


Я не уверен, с какой версии, но bytes на самом деле str, который вы можете увидеть, если вы делаете type(bytes(b"hi")) -><type 'str'>.

bytearray - это изменяемый массив байтов, один конструктор которого принимает строку.


я попробовал его на Python 3.0.

в Python 3.0, а bytes итератор возвращает ints, а не строки, как Python 2.6:

for i in bytes(b"hi"):
    print(type(i))

выдает:

<class 'int'>
<class 'int'>

A bytearray итератор и возвращает class 'int's.