Python 3.x phân biệt rõ ràng giữa các loại:
str = = '...' lít = một chuỗi các ký tự Unicode (UTF-16 hoặc UTF-32, tùy thuộc vào cách Python được biên dịch)
bytes= b'...'lít = một chuỗi các octet (số nguyên từ 0 đến 255)
Nếu bạn quen thuộc với Java hoặc C #, hãy nghĩ về stras Stringvà bytesas byte[]. Nếu bạn quen với SQL, nghĩ strnhư NVARCHARvà bytesnhư BINARYhay BLOB. Nếu bạn đã quen thuộc với Windows registry, nghĩ đến strnhư REG_SZvà bytesnhư REG_BINARY. Nếu bạn đã quen thuộc với C (++), thì hãy quên mọi thứ bạn đã học charvà chuỗi, bởi vì MỘT TÍNH NĂNG KHÔNG PHẢI LÀ BYTE . Ý tưởng đó đã lỗi thời.
Bạn sử dụng strkhi bạn muốn đại diện cho văn bản.
print('שלום עולם')
Bạn sử dụng byteskhi bạn muốn biểu diễn dữ liệu nhị phân cấp thấp như cấu trúc.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Bạn có thể mã hóa a strđến một bytesđối tượng.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
Và bạn có thể giải mã a bytesthành a str.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Nhưng bạn không thể tự do trộn lẫn hai loại.
>>> 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
Các b'...'ký hiệu là hơi khó hiểu ở chỗ nó cho phép các byte 0x01-0x7F được xác định với các ký tự ASCII thay vì số hex.
>>> b'A' == b'\x41'
True
Nhưng tôi phải nhấn mạnh, một ký tự không phải là một byte .
>>> 'A' == b'A'
False
Trong Python 2.x
Các phiên bản Pre-3.0 của Python thiếu loại phân biệt giữa dữ liệu văn bản và dữ liệu nhị phân. Thay vào đó, đã có:
unicode= u'...'chữ = chuỗi ký tự Unicode = 3.xstr
str= '...'lít / chuỗi các byte / ký tự bị xáo trộn
- Thông thường văn bản, được mã hóa trong một số mã hóa không xác định.
- Nhưng cũng được sử dụng để đại diện cho dữ liệu nhị phân như
struct.packđầu ra.
Để giảm bớt quá trình chuyển đổi từ 2.x sang 3.x, b'...'cú pháp bằng chữ đã được nhập vào Python 2.6, để cho phép phân biệt các chuỗi nhị phân (nên bytesở 3.x) với các chuỗi văn bản (nên strở trong 3 .x). Các btiền tố không có gì trong 2.x, nhưng kể2to3 kịch bản không để chuyển đổi nó thành một chuỗi Unicode trong 3.x.
Vì vậy, có, nghĩa b'...'đen trong Python có cùng mục đích mà chúng làm trong PHP.
Ngoài ra, chỉ vì tò mò, có nhiều biểu tượng hơn b và u làm những việc khác không?
Các rtiền tố tạo ra một chuỗi nguyên (ví dụ, r'\t'là một dấu gạch chéo + tthay vì một tab), và dấu ngoặc kép ba '''...'''hoặc """..."""cho phép nhiều dòng chuỗi literals.