2009-12-30 22 views
127
a='aaaa' 
print isinstance(a, basestring)#true 
print isinstance(a, str)#true 

Trả lời

320

Trong các phiên bản Python trước 3.0 có hai loại chuỗi "chuỗi đồng bằng" và "chuỗi unicode". Các chuỗi đồng bằng (str) không thể đại diện cho các ký tự nằm ngoài bảng chữ cái Latinh (bỏ qua chi tiết của các trang mã để đơn giản). Các chuỗi Unicode (unicode) có thể đại diện cho các ký tự từ bất kỳ bảng chữ cái nào bao gồm một số ký tự hư cấu như Klingon.

Vì vậy, tại sao có hai loại chuỗi, nó sẽ không tốt hơn nếu chỉ có Unicode vì nó sẽ bao gồm tất cả các trường hợp? Vâng, tốt hơn là chỉ có Unicode nhưng Python được tạo ra 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 đổi kiểu chuỗi trong một ngôn ngữ với nhiều người dùng, trong Python 3.0 nó cuối cùng là trường hợp tất cả các chuỗi là Unicode.

Các hệ thống phân cấp thừa kế của chuỗi Python pre-3.0 là:

  object 
      | 
      | 
     basestring 
      /\ 
     / \ 
     str unicode 

'basestring' giới thiệu trong Python 2.3 có thể được coi như một bước theo hướng chuỗi thống nhất vì nó có thể được sử dụng để kiểm tra xem một đối tượng là một thể hiện của str hoặc unicode

>>> 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 
+64

+1 cho đồ thị ascii đẹp ;-) – ChristopheD

+7

Đã thay đổi này bằng Python 3? Là 'str' và' byte' mới vẫn là con của 'basestring'? Sẽ có giá trị thêm một lưu ý về điều này. – MestreLion

+2

+1. Lời giải thích tuyệt vời cho những người không có nền tảng lập trình, những người đang cố gắng hiểu và hoàn thành công việc với Python (bao gồm cả tôi). – RubenGeert

8

Tất cả các chuỗi là chuỗi gốc, nhưng chuỗi unicode không thuộc loại str. Hãy thử thay vào đó:

>>> a=u'aaaa' 
>>> print isinstance(a, basestring) 
True 
>>> print isinstance(a, str) 
False 
1

Basestring là siêu lớp của chuỗi. Trong ví dụ của bạn, một kiểu là "str" ​​do đó, nó là cả một basestring, và một str

4

Thực sự những gì bạn đang hỏi là sự khác biệt giữa lớp basestring và 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, cũng 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 
Các vấn đề liên quan