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 中是否发生了这种变化?新的str
和byte
仍然是basestring
的子代吗?值得为此添加注释。
@MestreLion:它改变了; Py3 直接没有 basestring
和 str
和 bytes
两个子类 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) 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章