Python 3.x проводит четкое различие между типами:
str= '...'литералы = последовательность символов Unicode (UTF-16 или UTF-32, в зависимости от того, как Python был скомпилирован)
bytes= b'...'литералы = последовательность октетов (целые числа от 0 до 255)
Если вы знакомы с Java или C #, подумайте, strкак Stringи bytesкак byte[]. Если вы знакомы с SQL, подумайте strкак NVARCHARи bytesкак BINARYили BLOB. Если вы знакомы с реестром Windows, подумайте strкак REG_SZи bytesкак REG_BINARY. Если вы знакомы с C (++), то забудьте все, что вы узнали, charи строки, потому что CHARACTER НЕ БАЙТ . Эта идея давно устарела.
Вы используете, strкогда вы хотите представить текст.
print('שלום עולם')
Вы используете, bytesкогда хотите представить низкоуровневые двоичные данные, такие как структуры.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Вы можете кодироватьstr к bytesобъекту.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
И вы можете расшифровать bytesв str.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Но вы не можете свободно смешивать два типа.
>>> b'\xEF\xBB\xBF' + 'Text with a UTF-8 BOM'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str
b'...'Нотация несколько запутанным в том , что она позволяет байты 0x01-0x7F должны быть указаны с ASCII - символов вместо шестнадцатеричных цифр.
>>> b'A' == b'\x41'
True
Но я должен подчеркнуть, что символ не байт .
>>> 'A' == b'A'
False
В Python 2.x
В версиях Python до 3.0 не было такого различия между текстовыми и двоичными данными. Вместо этого было:
unicode= u'...'литералы = последовательность символов Unicode = 3.xstr
str= '...'литералы = последовательности смешанных байтов / символов
- Обычно текст, закодированный в какой-то неуказанной кодировке.
- Но также используется для представления двоичных данных, таких как
struct.packвывод.
Чтобы облегчить переход с 2.x на 3.x, b'...'буквальный синтаксис был перенесен в Python 2.6, чтобы позволить отличать двоичные строки (которые должны быть bytesв 3.x) от текстовых строк (которые должны быть strв 3 .Икс). bПриставка ничего не делает в 2.x, но говорит 2to3сценарий не преобразовать его в строку Unicode в 3.x.
Так что да, b'...'литералы в Python имеют ту же цель, что и в PHP.
Кроме того, просто из любопытства, есть ли больше символов, чем b и u, которые делают другие вещи?
rПрефикс создает строку (например, r'\t'является обратным слэшем + tвместо вкладки), а также тройные кавычки '''...'''или """..."""позволяют многострочным строковые литералы.