Antworten:
In Python-Versionen vor 3.0 gibt es zwei Arten von Zeichenfolgen: "einfache Zeichenfolgen" und "Unicode-Zeichenfolgen". Einfache Zeichenfolgen ( str) können keine Zeichen außerhalb des lateinischen Alphabets darstellen (der Einfachheit halber werden Details von Codepages ignoriert). Unicode-Zeichenfolgen ( unicode) können Zeichen aus jedem Alphabet darstellen, einschließlich einiger fiktiver Zeichen wie Klingonisch.
Warum also zwei Arten von Zeichenfolgen, wäre es nicht besser, nur Unicode zu haben, da dies alle Fälle abdecken würde? Nun, es ist besser, nur Unicode zu haben, aber Python wurde erstellt, bevor Unicode die bevorzugte Methode zur Darstellung von Zeichenfolgen war. Es braucht Zeit, um den Zeichenfolgentyp in eine Sprache mit vielen Benutzern zu überführen. In Python 3.0 ist es schließlich so, dass alle Zeichenfolgen Unicode sind.
Die Vererbungshierarchie von Python-Strings vor 3.0 lautet:
object
|
|
basestring
/ \
/ \
str unicode
Der in Python 2.3 eingeführte 'basestring' kann als ein Schritt in Richtung der Vereinheitlichung von Zeichenfolgen angesehen werden, da damit überprüft werden kann, ob ein Objekt eine Instanz von stroder istunicode
>>> 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
basestringund strund bytesbeide Unterklassen objectdirekt. Beachten Sie jedoch, dass dies sinnvoll ist, da Py2 strnicht mit Py3 identisch ist bytes. basestringsollte als "Zeichenkette" betrachtet werden, von der Py3 nur die hat str. Daher ersetzt das 2to3Tool basestringdurch str.
Alle Zeichenfolgen sind Basestrings, aber Unicode-Zeichenfolgen sind nicht vom Typ str. Versuchen Sie stattdessen Folgendes:
>>> a=u'aaaa'
>>> print isinstance(a, basestring)
True
>>> print isinstance(a, str)
False
Was Sie wirklich fragen, ist der Unterschied zwischen der Basis- und der Str-Klasse.
Str ist eine Klasse, die von basestr erbt. Es gibt aber auch Unicode-Zeichenfolgen, wie auch andere, wenn Sie eine erstellen möchten.
>>> a = u'aaaa'
>>> isinstance(a, str)
False
>>> isinstance(a, basestring)
True
strundbytenoch Kinder vonbasestring? Es lohnt sich, einen Hinweis dazu hinzuzufügen.