isinstance('aaa',basestring)和isinstance('aaa',str)有什么区别?


Answers:


387

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

那么,为什么要使用两种字符串,仅使用Unicode会更好,因为这将涵盖所有情况?最好只使用Unicode,但是在Unicode是表示字符串的首选方法之前创建了Python。在具有许多用户的语言中转换字符串类型需要花费时间,在Python 3.0中,最终所有字符串都是Unicode。

3.0版之前的Python字符串的继承层次结构为:

          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

13
Python 3发生了这种变化吗?是的新的strbyte仍然是的孩子basestring吗?值得为此添加注释。
MestreLion 2012年

14
@MestreLion:它变了;PY3没有basestringstrbytes两个子类object直接。但是请注意,这是有道理的,因为Py2 str与Py3不同bytesbasestring应该被认为是“字符串”,其中Py3仅具有str。因此,该2to3工具将替换basestringstr
索伦Løvborg

8

所有字符串都是基本字符串,但是unicode字符串不是str类型。尝试以下方法:

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

4

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

Str是从basestr继承的类。但是,如果您要创建unicode字符串,那么它也和其他字符串一样存在。

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

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.