In den frühen Tagen unserer Arbeit als Python-Programmierer stoßen wir alle auf verschiedene Arten von Fehlern in unserem Code, die nach einigen schmerzhaften Stunden in StackOverflow kein Fehler sind, sondern Python-Funktionen. Nachfolgend sind die 5 häufigsten Fehler aufgeführt, die die meisten neuen Python-Programmierer machen. Lassen Sie uns ein wenig über sie herausfinden, um mehrere Stunden zu sparen, indem wir Fragen auf Seiten und Gruppen auf Facebook stellen.
1. Kopieren Sie Wörterbücher oder Listen
Wenn Sie eine Kopie eines Wörterbuchs oder einer Liste erstellen müssen, reicht es nicht aus, nur den Zuweisungsoperator zu verwenden.
Falsch:>>> dict_a = {"name": "John", "address":"221B Baker street"} >>> dict_b = dict_a
Wenn Sie jetzt dict_b ändern oder aktualisieren, wird auch dict_a geändert - und das alles dank des Zuweisungsoperators. Mit diesem Operator versuchen Sie zu sagen, dass dict_b auf dasselbe Objekt wie dict_a verweist.
>>> dict_b["age"] = 26 >>> dict_b {'address': '221B Baker street', 'name': 'John', 'age': 26} >>> dict_a {'address': '221B Baker street', 'name': 'John', 'age': 26} >>>
Richtig: Verwenden Sie die Methoden copy () oder deepcopy ().
>>> dict_c = dict_b.copy() >>> dict_c["location"] = "somewhere" >>> dict_c {'address': '221B Baker street', 'name': 'John', 'age': 26, 'location': 'somewhere'} >>> dict_b {'address': '221B Baker street', 'name': 'John', 'age': 26} >>> dict_a {'address': '221B Baker street', 'name': 'John', 'age': 26} >>>
Sehen Sie den Unterschied zwischen Kopie und Deepcopy.2. Wörterbuchschlüssel
Versuchen wir, dem Wörterbuch Werte hinzuzufügen:
>>> dict_a = dict() >>> dict_a {} >>> dict_a[1] = "apple" >>> dict_a[True] = "mango" >>> dict_a[2] = "melon"
Was werden wir sehen, wenn wir versuchen, das Wörterbuch auf dem Bildschirm anzuzeigen?
>>> dict_a {1: 'mango', 2: 'melon'}
Was ist passiert, wo ist der wahre Schlüssel?
Es muss beachtet werden, dass die Boolesche Klasse von Integer (Integer) erbt. Und eine Ganzzahl, die True entspricht, ist 1; Das falsche Äquivalent ist 0. Daher wird der Wert für Schlüssel 1 einfach überschrieben.
>>> isinstance(True, int) True >>> isinstance(False, int) True >>> True == 1 True >>> False == 0 True
3. Aktualisieren von Listen oder Wörterbüchern
Angenommen, Sie möchten einer Liste ein Element hinzufügen.
>>> list_a = [1,2,3,4,5] >>> list_a = list_a.append(6) >>> list_a >>>
Oder versuchen Sie, das Wörterbuch zu aktualisieren.
>>> dict_a = {"a" : "b"} >>> dict_a = dict_a.update({"c" : "d"}) >>> dict_a >>>
Versuchen wir nun, die Liste zu ordnen.
>>> list_b = [2,5,3,1,7] >>> list_b = list_b.sort() >>> list_b >>>
Warum kommt nichts heraus, was machen wir falsch?
Die meisten Containermethoden (wie Sortieren, Aktualisieren, Anhängen, Hinzufügen usw.) sind für Leistungszwecke optimiert - und vermeiden das unnötige Erstellen separater Kopien.
Versuchen Sie nicht, den Rückgabewert solcher Methoden einer Variablen zuzuweisen.
Richtig: >>> list_a = [1,2,3,4,5] >>> list_a.append(6) >>> dict_a = {"a" : "b"} >>> dict_a.update({"c" : "d"}) >>> dict_a {'c': 'd', 'a': 'b'} >>> list_a.sort() >>> list_a [1, 2, 3, 4, 5, 6]
4. Internierte Saiten
In einigen Fällen versucht Python, vorhandene unveränderliche Objekte wiederzuverwenden. String Interning ist ein solcher Fall.
>>> a = "gmail" >>> b = "gmail" >>> a is b True
Hier haben wir versucht, zwei verschiedene Objekte zu erstellen - Strings. Aber als wir sie auf Äquivalenz getestet haben, stellte sich heraus, dass sie vollständig übereinstimmten. Dies liegt daran, dass Python kein anderes Objekt b erstellt hat, sondern b auf den ersten Wert von "gmail" verweisen ließ.
Alle Zeichenfolgen der Länge 1 werden interniert. Zeilen, die etwas anderes als ASCII-Zeichen, Zahlen und Unterstriche enthalten, werden nicht interniert.
Lass es uns überprüfen.
>>> a = "@gmail" >>> b = "@gmail" >>> a is b False
Denken Sie auch daran, dass == sich vom Operator is unterscheidet. Der Operator == prüft, ob die Werte äquivalent sind oder nicht, während der Operator is prüft, ob beide Variablen auf dasselbe Objekt verweisen.
>>> a = "@gmail" >>> b = "@gmail" >>> a is b False >>> a == b True
Denken Sie also daran, wenn Sie unveränderliche Zeichenfolgen oder die Operatoren == und is verwenden.
5. Die Standardargumente werden einmal ausgewertet.
Betrachten Sie ein Beispiel:
def func(a, lst=[]): lst.append(a) return lst print(func(1)) print(func(2))
Was wird Ihrer Meinung nach nach zwei Ausdrucken angezeigt?
Lassen Sie uns den Code ausführen.
>>> def func(a, lst=[]): ... lst.append(a) ... return lst ... >>> print(func(1)) [1] >>> print(func(2)) [1, 2]
Warum wird der zweite Fall ausgegeben [1, 2]? Sollte es nicht nur [2] sein?
Der Haken ist also, dass die Standardargumente nur einmal ausgewertet werden. Beim ersten Aufruf der Funktion func (1) wurde die Liste ausgewertet und festgestellt, dass sie leer war. Dies bedeutet, dass Sie 1 hinzufügen können. Beim zweiten Aufruf - func (2) - befindet sich jedoch bereits ein Element in der Liste, daher wird [1, 2] angezeigt.
Bonus: Leerzeichen und Tabulatoren müssen nicht gemischt werden. Tu es einfach nicht.