What is the difference between isinstance('aaa', basestring) and isinstance('aaa', str)?

a='aaaa'
print isinstance(a, basestring)#true
print isinstance(a, str)#true
88109 次浏览

所有字符串都是基本字符串,但 unicode 字符串不是 str 类型:

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

Basestring 是 string 的超类。在您的示例中,a 是“ str”类型,因此它既是基字符串,也是 str

实际上,您要问的是基字符串和 str 类之间的区别。

Str 是从 basestr 继承的类。但是 Unicode 字符串也是存在的,如果您想创建一个 Unicode 字符串,其他字符串也可以存在。

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

在3.0之前的 Python 版本中,有两种字符串“普通字符串”和“ unicode 字符串”。简单字符串(str)不能表示拉丁字母表之外的字符(为简单起见,忽略代码页的细节)。Unicode 字符串(unicode)可以表示任何字母表中的字符,包括一些虚构的字符,如克林贡字符。

那么为什么要使用两种字符串呢? 使用 Unicode 不是更好吗? 因为它可以覆盖所有的情况?最好只有 Unicode,但 Python 是在 Unicode 成为表示字符串的首选方法之前创建的。在许多用户的语言中转换字符串类型需要时间,在 Python 3.0中,最终所有字符串都是 Unicode。

Python 字符串 pre-3.0的继承层次结构是:

          object
|
|
basestring
/ \
/   \
str  unicode

Python 2.3中引入的“ basestring”可以被看作是字符串统一方向的一个步骤,因为它可以用来检查一个对象是 str还是 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