Warum gibt es keine ++
y --
Operatoren in Python?
Antworten
Zu viele Anzeigen?Klarheit!
Python hat viel mit Übersichtlichkeit und kein Programmierer wird wahrscheinlich die Bedeutung von --a
es sei denn, er/sie hat eine Sprache mit diesem Konstrukt gelernt.
Python hat auch viel mit Vermeidung von Konstruktionen, die zu Fehlern einladen und die ++
Die Betreiber sind bekanntlich eine große Fehlerquelle. Diese beiden Gründe reichen aus, um diese Operatoren in Python nicht zu verwenden.
Die Entscheidung, dass Python die Einrückung zur Kennzeichnung von Blöcken und nicht als syntaktische Mittel wie eine Form von Anfang/Ende-Klammern oder einer obligatorischen Endmarkierung beruht weitgehend auf denselben Überlegungen.
Zur Veranschaulichung sehen Sie sich die Diskussion über die Einführung eines bedingten Operators (in C: cond ? resultif : resultelse
) in Python im Jahr 2005. Lesen Sie zumindest die erste Nachricht und die Entscheidungsmeldung davon Diskussion (die bereits mehrere Vorläufer zum selben Thema hatte).
Triviales: Das darin häufig erwähnte PEP ist der "Python Enhancement Proposal". PEP 308 . LC bedeutet Listenverstehen , GE bedeutet Generatorausdruck (und keine Sorge, wenn diese Sie verwirren, sie sind keine der wenigen komplizierten Stellen von Python).
Ich verstehe, warum Python nicht über ++
Operator folgt: Wenn Sie dies in Python schreiben a=b=c=1
erhalten Sie drei Variablen (Beschriftungen), die auf dasselbe Objekt zeigen (dessen Wert 1 ist). Sie können dies überprüfen, indem Sie die Funktion id verwenden, die eine Objektspeicheradresse zurückgibt:
In [19]: id(a)
Out[19]: 34019256
In [20]: id(b)
Out[20]: 34019256
In [21]: id(c)
Out[21]: 34019256
Alle drei Variablen (Labels) verweisen auf dasselbe Objekt. Erhöhen Sie nun eine der Variablen und sehen Sie, wie sich dies auf die Speicheradressen auswirkt:
In [22] a = a + 1
In [23]: id(a)
Out[23]: 34019232
In [24]: id(b)
Out[24]: 34019256
In [25]: id(c)
Out[25]: 34019256
Sie können sehen, dass die Variable a
zeigt nun auf ein anderes Objekt als Variablen b
y c
. Denn Sie haben die a = a + 1
es ist ausdrücklich klar. Mit anderen Worten: Sie weisen dem Label ein völlig anderes Objekt zu a
. Stellen Sie sich vor, Sie können schreiben a++
würde dies darauf hindeuten, dass Sie die Variable nicht zugewiesen haben a
neues Objekt, aber ratteres Inkrement das alte. All diese Dinge dienen IMHO der Minimierung von Verwirrung. Zum besseren Verständnis siehe, wie Python Variablen funktioniert:
Ist Python call-by-value oder call-by-reference? Weder noch.
Übergibt Python als Wert oder als Referenz?
Ist Python pass-by-reference oder pass-by-value?
Python: Wie übergebe ich eine Variable per Referenz?
Verständnis von Python-Variablen und Speicherverwaltung
Emulation des Pass-by-Value-Verhaltens in Python
Das war einfach so geplant. Inkrement- und Dekrement-Operatoren sind nur Abkürzungen für x = x + 1
. Python hat in der Regel eine Entwurfsstrategie gewählt, die die Anzahl der alternativen Möglichkeiten zur Durchführung einer Operation reduziert. Erweiterter Auftrag ist das, was den Inkrement-/Dekrement-Operatoren in Python am nächsten kommt, und sie wurden erst mit Python 2.0 hinzugefügt.
Ich bin sehr neu in Python, aber ich vermute, dass der Grund dafür in der Betonung zwischen veränderlichen und unveränderlichen Objekten innerhalb der Sprache liegt. Nun, ich weiß, dass x++ leicht als x = x + 1 interpretiert werden kann, aber es sieht so aus, als ob Sie inkrementieren würden an Ort und Stelle ein Objekt, das unveränderlich sein könnte.
Nur meine Vermutung/Gefühl/Einschätzung.
Um bereits gute Antworten auf dieser Seite zu vervollständigen:
Nehmen wir an, wir beschließen, dies zu tun, indem wir ein Präfix ( ++i
), die die unären Operatoren + und - aufheben würden.
Heute ist die Voranstellung von ++
o --
bewirkt nichts, da es den unären Plus-Operator zweimal aktiviert (bewirkt nichts) oder den unären Minus-Operator zweimal (zweimal: hebt sich selbst auf)
>>> i=12
>>> ++i
12
>>> --i
12
Das würde diese Logik also möglicherweise durchbrechen.
Wenn man es nun für List Comprehensions oder Lambdas braucht, ist es ab Python 3.8 mit dem neuen :=
Zuweisungsoperator ( PEP572 )
Vorinkrementierung a
und ordnen Sie es zu b
:
>>> a = 1
>>> b = (a:=a+1)
>>> b
2
>>> a
2
Das Post-Inkrementieren muss nur die vorzeitige Addition durch Subtraktion von 1 ausgleichen:
>>> a = 1
>>> b = (a:=a+1)-1
>>> b
1
>>> a
2