514 Stimmen

Warum gibt es in Python keine ++ und -- Operatoren?

Warum gibt es keine ++ y -- Operatoren in Python?

14voto

Lutz Prechelt Punkte 32254

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).

12voto

Wakan Tanka Punkte 6582

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:

Warum kann eine Funktion in Python einige Argumente so verändern, wie sie vom Aufrufer wahrgenommen werden, andere aber nicht?

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

Python-Funktionen rufen per Referenz auf

Code wie ein Pythonista: Idiomatisches Python

7voto

Reed Copsey Punkte 536986

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.

6voto

mkoistinen Punkte 7534

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.

4voto

Jean-François Fabre Punkte 131296

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X