Python 3.x unterscheidet klar zwischen den Typen:
str= '...'Literale = eine Folge von Unicode-Zeichen (UTF-16 oder UTF-32, je nachdem, wie Python kompiliert wurde)
bytes= b'...'Literale = eine Folge von Oktetten (ganze Zahlen zwischen 0 und 255)
Wenn Sie mit Java oder C # vertraut sind, denken Sie an stras Stringund bytesas byte[]. Wenn Sie mit SQL vertraut sind, denken Sie an stras NVARCHARund bytesas BINARYoder BLOB. Wenn Sie mit der Windows-Registrierung vertraut sind, denken Sie an stras REG_SZund bytesas REG_BINARY. Wenn Sie mit C (++) vertraut sind, vergessen Sie alles, was Sie gelernt haben, charund Zeichenfolgen, da ein Zeichen kein Byte ist . Diese Idee ist längst überholt.
Sie verwenden, strwenn Sie Text darstellen möchten.
print('שלום עולם')
Sie werden verwendet, byteswenn Sie binäre Daten auf niedriger Ebene wie Strukturen darstellen möchten.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Sie können a in ein Objekt codieren .strbytes
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
Und Sie können a bytesin a dekodieren str.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Sie können die beiden Typen jedoch nicht frei mischen.
>>> 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
Die b'...'Notation ist insofern etwas verwirrend, als die Bytes 0x01-0x7F mit ASCII-Zeichen anstelle von Hex-Zahlen angegeben werden können.
>>> b'A' == b'\x41'
True
Aber ich muss betonen, ein Zeichen ist kein Byte .
>>> 'A' == b'A'
False
In Python 2.x.
In Versionen vor 3.0 von Python fehlte diese Unterscheidung zwischen Text und Binärdaten. Stattdessen gab es:
unicode= u'...'Literale = Folge von Unicode-Zeichen = 3.x.str
str= '...'Literale = Folgen von verwirrten Bytes / Zeichen
- Normalerweise Text, der in einer nicht spezifizierten Codierung codiert ist.
- Wird aber auch zur Darstellung von Binärdaten wie
struct.packAusgabe verwendet.
Um den Übergang von 2.x zu 3.x zu vereinfachen, wurde die b'...'Literal-Syntax auf Python 2.6 zurückportiert, um die Unterscheidung von Binärzeichenfolgen (die bytesin 3.x sein sollten) von Textzeichenfolgen (die strin 3 sein sollten) zu ermöglichen .x). Das bPräfix führt in 2.x nichts aus, weist das 2to3Skript jedoch an, es in 3.x nicht in eine Unicode-Zeichenfolge zu konvertieren.
Also ja, b'...'Literale in Python haben den gleichen Zweck wie in PHP.
Gibt es aus Neugier mehr Symbole als das b und u, die andere Dinge tun?
Das rPräfix erstellt eine unformatierte Zeichenfolge (z. B. r'\t'ein Backslash + tanstelle einer Registerkarte) und dreifache Anführungszeichen '''...'''oder """..."""lässt mehrzeilige Zeichenfolgenliterale zu.