Câu trả lời:
Trong các phiên bản Python trước 3.0, có hai loại chuỗi "chuỗi đơn giản" và "chuỗi unicode". Chuỗi đơn giản ( str
) không thể biểu thị các ký tự bên ngoài bảng chữ cái Latinh (bỏ qua chi tiết của các trang mã để đơn giản). Chuỗi Unicode ( unicode
) có thể biểu thị các ký tự từ bất kỳ bảng chữ cái nào, kể cả một số hư cấu như Klingon.
Vậy tại sao có hai loại chuỗi, sẽ không tốt hơn nếu chỉ có Unicode vì điều đó sẽ bao gồm tất cả các trường hợp? Tốt hơn là chỉ có Unicode nhưng Python đã được tạo trước khi Unicode là phương thức ưa thích để biểu diễn các chuỗi. Phải mất thời gian để chuyển loại chuỗi trong một ngôn ngữ có nhiều người dùng, trong Python 3.0 cuối cùng cũng có trường hợp tất cả các chuỗi là Unicode.
Hệ thống phân cấp kế thừa của chuỗi Python trước 3.0 là:
object
|
|
basestring
/ \
/ \
str unicode
'Basestring' được giới thiệu trong Python 2.3 có thể được coi là một bước theo hướng hợp nhất chuỗi vì nó có thể được sử dụng để kiểm tra xem một đối tượng có phải là một thể hiện của str
hay khôngunicode
>>> string1 = "I am a plain string"
>>> string2 = u"I am a unicode string"
>>> isinstance(string1, str)
True
>>> isinstance(string2, str)
False
>>> isinstance(string1, unicode)
False
>>> isinstance(string2, unicode)
True
>>> isinstance(string1, basestring)
True
>>> isinstance(string2, basestring)
True
basestring
và str
và bytes
cả lớp con object
trực tiếp. Nhưng lưu ý rằng điều này có ý nghĩa, vì Py2 str
không giống với Py3 bytes
. basestring
nên được coi là "chuỗi ký tự", trong đó Py3 chỉ có str
. Do đó 2to3
công cụ thay thế basestring
bằng str
.
Thực sự những gì bạn đang hỏi là sự khác biệt giữa lớp cơ sở và lớp str.
Str là một lớp kế thừa từ basestr. Nhưng các chuỗi unicode cũng tồn tại, như các chuỗi khác, nếu bạn muốn tạo một chuỗi.
>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True
str
vàbyte
vẫn còn củabasestring
? Sẽ có giá trị thêm một lưu ý về điều này.