关于python:isinstance(’aaa’,basestring)和isinstance(’aaa’,str)之间有什么区别?

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

1
2
3
a='aaaa'
print isinstance(a, basestring)#true
print isinstance(a, str)#true

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

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

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

1
2
3
4
5
6
7
          object
             |
             |
         basestring
            / \
           /   \
         str  unicode

python 2.3中引入的"basestring"可以看作是向字符串统一方向迈出的一步,因为它可以用来检查对象是str还是unicode的实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> 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


所有字符串都是基字符串,但Unicode字符串不是str类型。请尝试以下操作:

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


你真正要问的是basestring和str类之间的区别。

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

1
2
3
4
5
>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True

basestring是字符串的超类。在您的示例中,a的类型为"str",因此它既是basestring,又是str。