Python 3.x membuat perbedaan yang jelas antara jenis:
str
= '...'
literal = urutan karakter Unicode (UTF-16 atau UTF-32, tergantung pada bagaimana Python dikompilasi)
bytes
= b'...'
literal = urutan oktet (bilangan bulat antara 0 dan 255)
Jika Anda terbiasa dengan Java atau C #, pikirkan str
sebagai String
dan bytes
sebagai byte[]
. Jika Anda terbiasa dengan SQL, pikirkan str
as NVARCHAR
dan bytes
as BINARY
atau BLOB
. Jika Anda terbiasa dengan registri Windows, pikirkan str
sebagai REG_SZ
dan bytes
sebagai REG_BINARY
. Jika Anda terbiasa dengan C (++), lupakan semua yang telah Anda pelajari char
dan string, karena KARAKTER BUKAN BYTE . Gagasan itu sudah lama usang.
Anda gunakan str
saat Anda ingin merepresentasikan teks.
print('שלום עולם')
Anda gunakan bytes
saat Anda ingin merepresentasikan data biner tingkat rendah seperti struct.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Anda dapat mengkodekan suatu str
ke bytes
objek.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
Dan Anda dapat memecahkan kode bytes
menjadi str
.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Tetapi Anda tidak dapat dengan bebas mencampurkan kedua jenis itu.
>>> 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'...'
notasi agak membingungkan dalam yang memungkinkan byte 0x01-0x7F akan ditentukan dengan karakter ASCII bukan nomor hex.
>>> b'A' == b'\x41'
True
Tapi saya harus menekankan, karakter bukan byte .
>>> 'A' == b'A'
False
Dalam Python 2.x
Versi Pra-3.0 Python tidak memiliki perbedaan antara teks dan data biner. Sebaliknya, ada:
unicode
= u'...'
literal = urutan karakter Unicode = 3.xstr
str
= '...'
literal = urutan byte / karakter yang dikacaukan
- Biasanya teks, dikodekan dalam beberapa pengkodean yang tidak ditentukan.
- Tetapi juga digunakan untuk merepresentasikan data biner seperti
struct.pack
keluaran.
Untuk memudahkan transisi 2.x ke 3.x, b'...'
sintaks literal di-backport ke Python 2.6, untuk memungkinkan pembeda string biner (yang harus bytes
dalam 3.x) dari string teks (yang harus str
dalam 3 .x). The b
prefix tidak apa-apa di 2.x, tapi menceritakan 2to3
naskah untuk tidak mengubahnya ke string Unicode di 3.x.
Jadi ya, b'...'
literal dalam Python memiliki tujuan yang sama dengan yang mereka lakukan dalam PHP.
Juga, hanya karena penasaran, apakah ada lebih banyak simbol daripada b dan kamu yang melakukan hal lain?
The r
prefix menciptakan string mentah (misalnya, r'\t'
adalah backslash + t
bukan tab), dan kutipan tiga '''...'''
atau """..."""
memungkinkan multi-line string literal.