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
і рядки, тому що ХАРАКТЕР НЕ БЮТ . Ця ідея давно застаріла.
Ви використовуєте, 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
The 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 .x). b
Приставка нічого не робить в 2.x, але розповідає2to3
сценарій не перетворити його в рядок Unicode в 3.x.
Так що так, b'...'
літерали в Python мають ту саму мету, що і в PHP.
Крім того, тільки з цікавості, чи більше символів, ніж b і u, які роблять інші речі?
r
Префікс створює рядок (наприклад, r'\t'
є зворотним слешем + t
замість вкладки), а також потрійні лапки '''...'''
або """..."""
дозволяють багаторядковим рядкові літерали.