Python 3.x wyraźnie rozróżnia typy:
str
= '...'
literały = sekwencja znaków Unicode (UTF-16 lub UTF-32, w zależności od sposobu kompilacji Pythona)
bytes
= b'...'
literały = ciąg oktetów (liczby całkowite od 0 do 255)
Jeśli znasz Java lub C #, pomyśl o tym, str
co String
i bytes
jak byte[]
. Jeśli znasz SQL, pomyśl o tym str
jako NVARCHAR
i bytes
jako BINARY
lub BLOB
. Jeśli znasz rejestr systemu Windows, pomyśl o tym, str
co REG_SZ
i bytes
jak REG_BINARY
. Jeśli znasz C (++), zapomnij o wszystkim, czego się nauczyłeś char
i o łańcuchach, ponieważ ZNAK NIE JEST bajtem . Ten pomysł jest dawno przestarzały.
Używasz, str
gdy chcesz reprezentować tekst.
print('שלום עולם')
Używasz go, bytes
gdy chcesz reprezentować dane binarne niskiego poziomu, takie jak struktury.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Możesz zakodować a str
do bytes
obiektu.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
I możesz zdekodować a bytes
na str
.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Ale nie można swobodnie mieszać tych dwóch rodzajów.
>>> 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'...'
Notacja jest nieco mylące w tym, że pozwala bajty 0x01-0x7F być określone za pomocą znaków ASCII zamiast liczb hex.
>>> b'A' == b'\x41'
True
Ale muszę podkreślić, że postać nie jest bajtem .
>>> 'A' == b'A'
False
W Python 2.x
Wersje Pythona w wersjach wcześniejszych niż 3.0 nie zawierały tego rodzaju rozróżnienia między tekstem a danymi binarnymi. Zamiast tego były:
unicode
= u'...'
literały = sekwencja znaków Unicode = 3.xstr
str
= '...'
literały = sekwencje pomieszanych bajtów / znaków
- Zwykle tekst zakodowany w nieokreślonym kodowaniu.
- Ale również używany do reprezentowania danych binarnych, takich jak dane
struct.pack
wyjściowe.
W celu ułatwienia przejścia z wersji 2.x do 3.x b'...'
literalna składnia została przeniesiona do Pythona 2.6, aby umożliwić odróżnienie ciągów binarnych (które powinny być bytes
w wersji 3.x) od ciągów tekstowych (które powinny być str
w postaci 3 .x). b
Prefiks robi nic 2.x, ale opowiada 2to3
scenariusz nie przekonwertować go na ciąg znaków Unicode w 3.x.
Tak więc, b'...'
literały w Pythonie mają ten sam cel, co w PHP.
Poza tym, z ciekawości, czy jest więcej symboli niż b i u, które robią inne rzeczy?
r
Przedrostek tworzy surowy ciąg (np r'\t'
jest odwrotny ukośnik + t
zamiast zakładka) i potrójne cytaty '''...'''
lub """..."""
pozwalają literały ciągów kilka linii.