a='aaaa'
print isinstance(a, basestring)#true
print isinstance(a, str)#true
3.0より前のPythonバージョンには、2種類の文字列「プレーン文字列」と「ユニコード文字列」があります。プレーン文字列(str
)は、ラテンアルファベット以外の文字を表すことはできません(簡単にするためにコードページの詳細を無視します)。 Unicode文字列(unicode
)は、Klingonなどの架空のものを含む、任意のアルファベットの文字を表すことができます。
では、なぜ2種類の文字列があるのでしょうか。すべてのケースをカバーするので、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
すべての文字列はベース文字列ですが、Unicode文字列はstr型ではありません。代わりにこれを試してください:
>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False
実際に求めているのは、basestringクラスとstrクラスの違いです。
Strは、basestrを継承するクラスです。ただし、他の文字列を作成する場合は、Unicode文字列も存在します。
>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True
Basestringは、stringのスーパークラスです。あなたの例では、aは「str」型であり、したがって、ベースストリングとstrの両方です