Python 3.xทำให้เห็นความแตกต่างที่ชัดเจนระหว่างประเภท:
str
= '...'
literals = ลำดับของอักขระ Unicode (UTF-16 หรือ UTF-32 ขึ้นอยู่กับการรวบรวม Python)
bytes
= b'...'
literals = ลำดับของ octets (จำนวนเต็มตั้งแต่ 0 ถึง 255)
หากคุณคุ้นเคยกับ Java หรือ C #, คิดstr
เป็นString
และเป็นbytes
byte[]
หากคุณคุ้นเคยกับ SQL คิดstr
เป็นNVARCHAR
และbytes
เป็นหรือBINARY
BLOB
หากคุณคุ้นเคยกับรีจิสทรีของ Windows คิดstr
เป็นREG_SZ
และเป็นbytes
REG_BINARY
หากคุณคุ้นเคยกับ C (++) แล้วลืมทุกสิ่งที่คุณได้เรียนรู้char
และเกี่ยวกับสตริงเพราะตัวละครไม่ใช่ไบต์BYTE ความคิดนั้นล้าสมัยมานาน
คุณใช้str
เมื่อคุณต้องการแสดงข้อความ
print('שלום עולם')
คุณใช้bytes
เมื่อคุณต้องการแสดงข้อมูลไบนารีระดับต่ำเช่น structs
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
คุณสามารถเข้ารหัส a str
ไปยังbytes
วัตถุ
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
และคุณสามารถถอดรหัสเป็นbytes
str
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
แต่คุณไม่สามารถผสมสองประเภทได้อย่างอิสระ
>>> 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
b'...'
สัญกรณ์ค่อนข้างสับสนในการที่จะช่วยให้ไบต์ 0x01-0x7F จะถูกระบุด้วยอักขระ ASCII แทนตัวเลขฐานสิบหก
>>> b'A' == b'\x41'
True
แต่ผมต้องเน้นตัวละครไม่ได้เป็นไบต์
>>> 'A' == b'A'
False
ใน Python 2.x
Python เวอร์ชัน 3.0 รุ่นก่อนขาดความแตกต่างระหว่างข้อความและข้อมูลไบนารี แต่กลับมี:
unicode
= u'...'
literals = ลำดับของอักขระ Unicode = 3.xstr
str
= '...'
literals = sequences ของไบต์ / อักขระที่สับสน
- โดยทั่วไปแล้วข้อความเข้ารหัสในการเข้ารหัสบางอย่างที่ไม่ระบุ
- แต่ยังใช้เพื่อแสดงข้อมูลไบนารีเช่น
struct.pack
เอาต์พุต
เพื่อให้ง่ายต่อการเปลี่ยนแปลง 2.x-to-3.x b'...'
ไวยากรณ์ตามตัวอักษรถูก backported เป็น Python 2.6 เพื่อให้สามารถแยกสตริงไบนารี่ (ซึ่งควรเป็นbytes
3.x) จากสตริงข้อความ (ซึ่งควรเป็นstr
3 .x) b
คำนำหน้าไม่ทำอะไรเลยใน 2.x แต่บอก2to3
สคริปต์ไม่ได้ที่จะแปลงเป็นสายอักขระ Unicode ใน 3.x.
ใช่แล้วb'...'
ตัวอักษรใน Python มีจุดประสงค์เดียวกับที่ใช้ใน PHP
นอกจากนี้จากความอยากรู้มีสัญลักษณ์มากกว่า b และ u ที่ทำอย่างอื่นหรือไม่?
r
คำนำหน้าสร้างสตริงดิบ (เช่นr'\t'
เป็นเครื่องหมาย + t
แทนแท็บ) และคำพูดที่สาม'''...'''
หรือ"""..."""
อนุญาตให้มีหลายคู่สายสายอักขระตัวอักษร