Ten*_*she 381

在3.0之前的Python版本中,有两种字符串"plain strings"和"unicode strings".普通字符串(str)不能表示拉丁字母之外的字符(为简单起见,忽略代码页的详细信息).Unicode字符串(unicode)可以表示任何字母表中的字符,包括像Klingon这样的虚构字符.

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

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

          object
             |
             |
         basestring
            / \
           /   \
         str  unicode
Run Code Online (Sandbox Code Playgroud)

Python 2.3中引入的"basestring"可以被认为是字符串统一方向的一个步骤,因为它可以用来检查对象是否是一个实例strunicode

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • @MestreLion:它改变了; Py3没有`basestring`和`str`和`bytes`都直接子类`object`.但请注意,这是有道理的,因为Py2`st`与Py3`bytes`不同.`basestring`应该被认为是"字符串",其中Py3只有`str`.因此,`2to3`工具用`str`替换`basestring`. (11认同)
  • 这在Python 3中有变化吗?新的`str`和`byte`仍然是`basestring`的孩子吗?值得添加关于此的说明. (10认同)

Mar*_*ers 8

所有字符串都是basetrings,但是unicode字符串不是str类型.试试这个:

>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False
Run Code Online (Sandbox Code Playgroud)