isinstance( 'aaa'、basestring)とisinstance( 'aaa'、str)の違いは何ですか?


回答:


387

3.0より前のバージョンのPythonでは、「プレーン文字列」と「ユニコード文字列」の2種類の文字列があります。プレーンな文字列(str)は、ラテンアルファベット以外の文字を表すことはできません(コードページの詳細を無視して簡単にします)。Unicode文字列(unicode)は、クリンゴン語などの架空の文字を含む任意のアルファベットの文字を表すことができます。

それでは、なぜ2種類の文字列があるのでしょうか?それはすべてのケースをカバーするので、Unicodeだけを持っている方が良いでしょうか?まあ、Unicodeだけを使う方がいいですが、PythonはUnicodeが文字列を表現するための好ましい方法になる前に作成されました。多くのユーザーがいる言語で文字列型を移行するには時間がかかります。Python3.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には持っていないbasestringstrし、bytes両方のサブクラスをobject直接。ただし、Py2 strはPy3と同じではないため、これは理にかなっていることに注意してくださいbytesbasestringPy3はのみを持つ「文字列」と考える必要がありstrます。したがって、2to3ツールはに置き換えbasestringられstrます。
セーレン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はstringのスーパークラスです。あなたの例では、aはタイプ「str」であるため、ベースストリングとstrの両方です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.