Питон 3
Начиная с Python 3.0 в справочнике по языку Python указано:
Объект bytes представляет собой неизменяемый массив. Элементы представляют собой 8-битные байты, представленные целыми числами в диапазоне 0 ‹= x ‹ 256.
Питон 2
До этого (т. е. до Python 2.7) он указывал (как уже упоминалось в вопросе):
Элементами строки являются символы. [] Символы представляют собой (как минимум) 8-битные байты.
(Выделение добавлено.)
Обратите внимание, что в Python 2 не было объекта bytes
. Для хранения неизменяемых последовательностей двоичных данных, разделенных на байты, в Python 2 обычно использовались/используются строки. (Напротив, строки Python 3 предназначены только для текстовых данных и более эквивалентны объектам unicode
Python 2, чем строкам Python 2.)
но ...
В документации Python 2 для ord()
function упоминаются "8-битные строки" и противопоставляет их объектам Unicode. Может подразумеваться, что все строки Python-2, не поддерживающие юникод, являются 8-битными строками, но я бы на это не рассчитывал.
Вывод
Реализация Python, предоставляющая объекты bytes
, совместимые с Python-3, будет ограничена тем, что в них будут храниться только 8-битные байты. Реализация Python, совместимая с Python 2, не будет связана с этим (поскольку объект bytes
, если он есть, будет неуказанным), и если бы вы использовали его строки, совместимые с Python-2, в качестве замены, не было бы любые гарантии относительно максимального размера байта (на самом деле, размера символа), если только реализация не устанавливает некоторые собственные гарантии.
person
Community
schedule
28.03.2016
str
в вопросе. Я обновил вопрос, чтобы показать примеры кода Python 3 и Python 2. - person jfs   schedule 28.03.2016char
иbyte
в основном являются синонимами, POSIX изначально не делал заявлений о количестве битов в байте. Спецификация C99 окольным путем требовала, чтобы байт был 8-битным (путем построения бестолкового набора требований, единственным решением которого был 8-битный байт, без фактического указания этого явно), и поэтому Open Group в современном POSIX стандарты (с 2001 г. по настоящее время) требуют, чтобы байты были 8-битными (обоснование здесь: pubs. opengroup.org/onlinepubs/009695399/xrat/xbd_chap03.html). При всем при этом справочник по языку Python требует, чтобы байты были 8-битными. - person Nick Bastin   schedule 28.03.2016CHAR_BIT == 8
(sizeof(char) == 1
, т.е. char здесь байт) 3- В принципе, определение Python того, что такоеbyte
, может отличаться от определенияbyte
, используемого другими частями системы, такой как JVM, компилятор C, CPU. Хотя на практике они совпадают. - person jfs   schedule 28.03.20168 bits per byte)
, но это неверно. CHAR_BIT и байт не имеют указанных отношение. - person Nick Bastin   schedule 28.03.2016CHAR_BIT != 8
, ноsizeof(char) == 1
, то есть количество битов в символе в любом случае равно количеству битов в байте. Вы говорите, что есть платформы, гдеsizeof(char)!=1
? - person jfs   schedule 28.03.2016CHAR_BIT
всегда равно 8, потому что так говорит стандарт. Но такжеsizeof char == 1
всегда, потому что стандарт также делает это требованием (задолго до C99), независимо от реализации (базовая реализация может делать все, что хочет, но компилятор должен сообщить, чтоsizeof char
равно1
). Я хочу сказать, что ни один из этих типов не может быть байтом с точки зрения вашей архитектуры. (по какой-то причине не удалось перейти в чат, поэтому пишу здесь) - person Nick Bastin   schedule 29.03.2016CHAR_BIT
не всегда8
2- да,sizeof(char)==1
(упоминаю это в третий раз) и поэтомуchar
здесь байт ( как я уже говорил). Вы не смогли привести пример, когда char не является байтом. - person jfs   schedule 29.03.2016sizeof char == 1
не означает, что это байт, и это не означает, что единицей хранения дляchar
на самом деле являетсяCHAR_BIT
(она просто должна выглядеть таковой, не требуется, чтобы он фактически былCHAR_BIT
внутренне). Я действительно не знаю, что вы пытаетесь сказать здесь - моя единственная точка зрения заключается в том, чтоCHAR_BIT
не имеет предсказуемой связи с размером байта архитектуры. - person Nick Bastin   schedule 29.03.2016CHAR_BIT == 8
- это прямо сказано в вопросе. POSIX в моем вопросе является примером спецификации, которая явно определяет значениеCHAR_BIT
. Это не означает, что сам вопрос ограничивается POSIX. Я согласен с тем, что эти комментарии выходят за рамки — как я сказал в ответ на ваш самый первый комментарий: я не понимаю, как это обсуждение относится к вопросу. 2- Я нашел явную ссылку в c99: Байт содержитCHAR_BIT
битов, что является утверждением в вопросе:CHAR_BIT==8
подразумевает 8-битные байты. - person jfs   schedule 29.03.2016CHAR_BIT
как byte и это неверно. - person Nick Bastin   schedule 29.03.2016CHAR_BIT
как байт. Стандарт C указывает, чтоCHAR_BIT
- это количество битов в байте, поэтому POSIX также указывает его. POSIX (вдобавок) указывает, чтоCHAR_BIT == 8
и POSIX также явно говорит: >CHAR_BIT
Количество битов в типеchar
. Как бы вы его ни нарезали: количество битов в байте равно количеству битов вchar
. - person jfs   schedule 29.03.2016char
!= биты в байте для многих архитектур. - person Nick Bastin   schedule 29.03.2016