Python 3.x fa una chiara distinzione tra i tipi:
str
= '...'
valori letterali = una sequenza di caratteri Unicode (UTF-16 o UTF-32, a seconda di come è stato compilato Python)
bytes
= b'...'
valori letterali = una sequenza di ottetti (numeri interi compresi tra 0 e 255)
Se hai familiarità con Java o C #, pensa a str
come String
e bytes
come byte[]
. Se hai familiarità con SQL, pensa a str
come NVARCHAR
e bytes
come BINARY
o BLOB
. Se hai familiarità con il registro di Windows, pensa a str
come REG_SZ
e bytes
come REG_BINARY
. Se hai familiarità con C (++), allora dimentica tutto ciò che hai appreso char
e le stringhe, perché UN PERSONAGGIO NON È UN BYTE . Quell'idea è da lungo tempo obsoleta.
Si utilizza str
quando si desidera rappresentare il testo.
print('שלום עולם')
Si utilizza bytes
quando si desidera rappresentare dati binari di basso livello come le strutture.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
È possibile codificare a str
in un bytes
oggetto.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
E puoi decodificare a bytes
in a str
.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Ma non puoi mescolare liberamente i due tipi.
>>> 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
La b'...'
notazione è alquanto confusa in quanto consente di specificare i byte 0x01-0x7F con caratteri ASCII anziché numeri esadecimali.
>>> b'A' == b'\x41'
True
Ma devo sottolineare, un personaggio non è un byte .
>>> 'A' == b'A'
False
In Python 2.x
Le versioni pre-3.0 di Python mancavano di questo tipo di distinzione tra testo e dati binari. Invece, c'era:
unicode
= u'...'
valori letterali = sequenza di caratteri Unicode = 3.xstr
str
= '...'
valori letterali = sequenze di byte / caratteri confusi
- Di solito testo, codificato in una codifica non specificata.
- Ma usato anche per rappresentare dati binari come l'
struct.pack
output.
Per facilitare la transizione da 2.x-a-3.x, la b'...'
sintassi letterale è stata importata in Python 2.6, al fine di consentire di distinguere le stringhe binarie (che dovrebbero essere bytes
in 3.x) dalle stringhe di testo (che dovrebbero essere str
in 3 .X). Il b
prefisso non fa nulla in 2.x, ma dice allo 2to3
script di non convertirlo in una stringa Unicode in 3.x.
Quindi sì, i b'...'
letterali in Python hanno lo stesso scopo che hanno in PHP.
Inoltre, solo per curiosità, ci sono più simboli di b e u che fanno altre cose?
Il r
prefisso crea una stringa non elaborata (ad esempio, r'\t'
è una barra rovesciata + t
anziché una scheda) e tripla virgolette '''...'''
o """..."""
consente letterali stringa a più righe.