Apa arti awalan ab sebelum string python?

107

Dalam kode sumber python saya menemukan saya telah melihat b kecil sebelum string seperti di:

b"abcdef"

Saya tahu tentang uawalan yang menandakan string unicode, dan rawalan untuk string mentah literal.

Apa bkepanjangannya dan jenis kode sumber apa yang berguna karena tampaknya persis seperti string biasa tanpa awalan apa pun?

kriss
sumber
10
@SLott: ikuti tautan yang Anda berikan, Anda akan melihat awalan b tidak diizinkan dalam awalan string ... untuk 2.6 (tampak seperti kesalahan kecil dalam materi referensi). Dan mencari tahu tentang hal-hal semacam ini di Google tidaklah mudah. Saya mencoba kata kunci seperti "awalan string b python" dan pada dasarnya tidak berhasil.
kriss
Tautan yang digunakan S.Lott tidak memiliki penentu versi; ini tentang Python 3: docs.python.org/3/reference/… . Awalan sekarang juga didukung dalam Python 2.6 dan yang lebih baru untuk memfasilitasi kode Python lintas versi.
Martijn Pieters
1
pertanyaan ini bukanlah "duplikat persis" atau jawaban untuk pertanyaan "Dapatkah saya menghilangkan karakter 'b' ini dalam pernyataan cetak saya?" stackoverflow.com/questions/42599851/… maukah Anda menghapus tanda itu, marijin? orang yang bertanya serta orang yang benar-benar mencoba menjawab mungkin menghargai kemampuan memiliki jawaban untuk pertanyaan sebenarnya yang diajukan.
saya_

Jawaban:

62

Ini adalah bytes literal Python3 . Awalan ini tidak ada di Python 2.5 dan yang lebih lama (ini setara dengan string biasa 2.x, sedangkan string biasa 3.x setara dengan literal dengan uawalan di 2.x). Python 2.6+ itu adalah setara dengan string biasa, untuk kompatibilitas dengan 3.x .

wRAR
sumber
@WRAR: Apakah di python 2.6 kode saya melihat ini, tampaknya itu diperkenalkan pada python2.6
kriss
Saya secara khusus memeriksanya di referensi 2.6 sebelum memposting: docs.python.org/reference/lexical_analysis.html#literals
wRAR
1
Oke, "Untuk kompatibilitas di masa mendatang, Python 2.6 menambahkan byte sebagai sinonim untuk tipe str, dan itu juga mendukung notasi b ''.", Dari "What's new".
WRAR
seperti link di atas sekarang arahkan ke 2,7 referensi dan b awalan ditambahkan, di sini adalah link ke referensi palsu tua docs.python.org/release/2.6.8/reference/...
kriss
98

The bprefix menandakan bytesliteral string yang .

Jika Anda melihatnya digunakan dalam kode sumber Python 3, ekspresi tersebut membuat bytesobjek , bukan objek Unicodestr biasa . Jika Anda melihatnya bergema di shell Python Anda atau sebagai bagian dari daftar, dict, atau konten container lainnya, Anda akan melihat bytesobjek yang diwakili menggunakan notasi ini.

bytesobjek pada dasarnya berisi urutan bilangan bulat dalam kisaran 0-255, tetapi ketika diwakili, Python menampilkan byte ini sebagai titik kode ASCII untuk mempermudah membaca kontennya. Setiap byte di luar dicetak berbagai karakter ASCII ditampilkan sebagai escape sequence (misalnya \n, \x82, dll). Sebaliknya, Anda dapat menggunakan karakter ASCII dan escape sequence untuk menentukan nilai byte; untuk nilai ASCII, nilai numeriknya digunakan (misalnya b'A'== b'\x41')

Karena bytesobjek terdiri dari urutan bilangan bulat, Anda dapat membuat bytesobjek dari urutan bilangan bulat lainnya dengan nilai dalam rentang 0-255, seperti daftar:

bytes([72, 101, 108, 108, 111])

dan pengindeksan memberi Anda kembali bilangan bulat (tetapi mengiris menghasilkan bytes nilai, karena contoh di atas, value[0]memberi Anda 72, tetapi value[:1]adalah b'H'sebagai 72 adalah titik kode ASCII untuk huruf H ).

bytesmodel data biner , termasuk teks yang disandikan . Jika bytesnilai Anda memang berisi teks, Anda harus mendekodekannya terlebih dahulu, menggunakan codec yang benar. Jika data dienkode sebagai UTF-8, misalnya, Anda dapat memperoleh strnilai Unicode dengan:

strvalue = bytesvalue.decode('utf-8')

Sebaliknya, beralih dari teks dalam a str objek ke bytesAnda perlu melakukan encode . Anda perlu memutuskan encoding yang akan digunakan; defaultnya adalah menggunakan UTF-8, tetapi yang Anda perlukan sangat bergantung pada kasus penggunaan Anda:

bytesvalue = strvalue.encode('utf-8')

Anda juga dapat menggunakan konstruktor, bytes(strvalue, encoding)untuk melakukan hal yang sama.

Baik metode decoding dan encoding membutuhkan argumen tambahan untuk menentukan bagaimana error harus ditangani .

Python 2, versi 2.6 dan 2.7 juga mendukung pembuatan literal b'..'string menggunakan sintaks literal string, untuk memudahkan kode yang berfungsi pada Python 2 dan 3.

bytesobjek tidak dapat diubah, seperti strstring. Gunakan bytearray()objek jika Anda perlu memiliki nilai byte yang bisa berubah.

Martijn Pieters
sumber