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
вместо вкладки), а также тройные кавычки '''...'''
или """..."""
позволяют многострочным строковые литералы.