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

Posted

技术标签:

【中文标题】isinstance(\'aaa\', basestring) 和 isinstance(\'aaa\', str) 有啥区别?【英文标题】:What is the difference between isinstance('aaa', basestring) and isinstance('aaa', str)?isinstance('aaa', basestring) 和 isinstance('aaa', str) 有什么区别? 【发布时间】:2010-12-31 01:02:08 【问题描述】:
a='aaaa'
print isinstance(a, basestring)#true
print isinstance(a, str)#true

【问题讨论】:

【参考方案1】:

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

那么为什么有两种字符串呢,难道只有 Unicode 会更好,因为它可以涵盖所有情况吗?好吧,最好只有 Unicode,但 Python 是在 Unicode 成为表示字符串的首选方法之前创建的。在有很多用户的语言中转换字符串类型需要时间,在 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

【讨论】:

在 Python 3 中是否发生了这种变化?新的strbyte 仍然是basestring 的子代吗?值得为此添加注释。 @MestreLion:它改变了; Py3 直接没有 basestringstrbytes 两个子类 object。但请注意,这是有道理的,因为 Py2 str 与 Py3 bytes 不同。 basestring 应该被认为是“字符串”,其中 Py3 只有str。因此2to3 工具将basestring 替换为str 在 python3 中,isinstance(string2, str) 将是 True 所有字符串都存储为 unicoded【参考方案2】:

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

Str 是一个继承自 basestr 的类。但是如果你想创建一个 unicode 字符串,其他字符串也存在。

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于isinstance('aaa', basestring) 和 isinstance('aaa', str) 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

python中的basestring

python basestring()

python basestring函数(33)

01Python内置函数_集合操作类

14 isinstance type issubclass及反射

pythonisinstance可以接收多个类型,hasattr,getattr,setattr