Ich stelle fest, dass ein Vorinkrementierungs- / Dekrementierungsoperator auf eine Variable (wie ++count
) angewendet werden kann . Es wird kompiliert, ändert aber den Wert der Variablen nicht!
Wie verhalten sich die Operatoren vor dem Inkrementieren / Dekrementieren (++ / -) in Python?
Warum weicht Python vom Verhalten dieser Operatoren in C / C ++ ab?
++
und--
Operatoren gebracht?sta x++
... speichert der resultierende atomare Befehl dena
Akkumulator, auf den erx
zeigt, und erhöht sich dannx
um die Größe des Akkumulators. Dies geschieht, weil es schneller als Zeigerarithmetik ist, weil es sehr häufig ist und weil es leicht zu verstehen ist. Sowohl vor als auch nach.Antworten:
++
ist kein Operator. Es sind zwei+
Operatoren. Der+
Operator ist der Identitätsoperator , der nichts tut. (Klarstellung: Die+
und-
unäre Operatoren arbeiten nur mit Zahlen, aber ich gehe davon aus, dass Sie nicht erwarten würden, dass ein hypothetischer++
Operator mit Zeichenfolgen arbeitet.)Analysiert als
Was übersetzt bedeutet
Sie müssen den etwas längeren
+=
Operator verwenden, um das zu tun, was Sie tun möchten:Ich vermute, dass die
++
und--
Operatoren aus Gründen der Konsistenz und Einfachheit weggelassen wurden. Ich kenne das genaue Argument, das Guido van Rossum für die Entscheidung vorgebracht hat, nicht, aber ich kann mir einige Argumente vorstellen:++count
ist nicht eindeutig, wie es sein könnte+
,+
,count
(zwei einstellige+
Operatoren) genauso einfach wie es sein könnte++
,count
(ein einstelliger++
Operator). Es ist keine signifikante syntaktische Mehrdeutigkeit, aber es existiert.++
ist nichts weiter als ein Synonym für+= 1
. Es war eine Kurzform, die erfunden wurde, weil C-Compiler dumm waren und nicht wussten, wie siea += 1
dieinc
Anweisungen der meisten Computer optimieren sollten . In der heutigen Zeit der Optimierung von Compilern und Bytecode-interpretierten Sprachen ist das Hinzufügen von Operatoren zu einer Sprache, mit der Programmierer ihren Code optimieren können, normalerweise verpönt, insbesondere in einer Sprache wie Python, die konsistent und lesbar ist.++
Operatoren besteht darin, die Unterschiede (sowohl in Bezug auf die Priorität als auch in Bezug auf den Rückgabewert) zwischen den Operatoren vor und nach dem Inkrementieren / Dekrementieren zu verwechseln, und Python eliminiert gerne die Sprache "gotcha" -s. Der Rang Fragen von Pre- / Post-Inkrement in C sind ziemlich behaart, und unglaublich einfach zu vermasseln.quelle
+
Operator hat eine Verwendung. Bei dezimalen.Dezimalobjekten wird auf die aktuelle Genauigkeit gerundet.+ +
und++
ohne LL zu brechen (1).++
nichts anderes als ein Synonym für ist+= 1
. Es gibt Pre-Inkrement- und Post-Inkrement-Varianten von ++, daher ist dies eindeutig nicht dasselbe. Ich stimme jedoch dem Rest Ihrer Punkte zu.Wenn Sie inkrementieren oder dekrementieren möchten, möchten Sie dies normalerweise für eine Ganzzahl tun. Wie so:
In Python sind Ganzzahlen jedoch unveränderlich . Das heißt, Sie können sie nicht ändern. Dies liegt daran, dass die ganzzahligen Objekte unter mehreren Namen verwendet werden können. Versuche dies:
a und b oben sind eigentlich das gleiche Objekt. Wenn Sie a erhöhen, erhöhen Sie auch b. Das willst du nicht. Sie müssen also neu zuweisen. So was:
Oder einfacher:
Was neu zuweisen wird
b
zub+1
. Dies ist kein Inkrementierungsoperator, da er nicht inkrementiertb
, sondern neu zugewiesen wird.Kurz gesagt: Python verhält sich hier anders, weil es nicht C ist und kein Wrapper auf niedriger Ebene um Maschinencode, sondern eine dynamische Sprache auf hoher Ebene, in der Inkremente keinen Sinn ergeben und auch nicht so notwendig sind wie in C. , wo Sie sie zum Beispiel jedes Mal verwenden, wenn Sie eine Schleife haben.
quelle
i++
würde bedeuten,i + 1
der Variablen zuzuweiseni
.i = 5; i++
Mittel zuzuordnen ,6
umi
die nicht zu ändernint
Objekt , auf das durchi
. Das heißt, es bedeutet nicht, den Wert von5
zu erhöhen !i++
nur l-Werte verarbeitet. Wenn beabsichtigt wäre, das Objekt, auf das verwiesen wirdi
, zu erhöhen, wäre diese Einschränkung nicht erforderlich.Während die anderen Antworten insofern richtig sind, als sie zeigen, was ein bloßes
+
tut (nämlich die Zahl so lassen, wie sie ist, wenn es eine ist), sind sie insofern unvollständig, als sie nicht erklären, was passiert.Um genau zu sein,
+x
bewertet zux.__pos__()
und++x
zux.__pos__().__pos__()
.Ich könnte mir eine SEHR seltsame Klassenstruktur vorstellen (Kinder, mach das nicht zu Hause!) Wie diese:
quelle
Python verfügt nicht über diese Operatoren, aber wenn Sie sie wirklich benötigen, können Sie eine Funktion mit derselben Funktionalität schreiben.
Verwendungszweck:
Innerhalb einer Funktion müssen Sie local () als zweites Argument hinzufügen, wenn Sie die lokale Variable ändern möchten. Andernfalls wird versucht, die globale Variable zu ändern.
Auch mit diesen Funktionen können Sie:
Meiner Meinung nach ist der folgende Ansatz jedoch viel klarer:
Dekrementierungsoperatoren:
Ich habe diese Funktionen in meinem Modul verwendet, um Javascript in Python zu übersetzen.
quelle
Wikipedia
Wenn Sie also solche Operatoren einführen, können Sie die Aufteilung von Ausdruck und Anweisung aufheben.
Aus dem gleichen Grund kann man nicht schreiben
wie Sie können in einigen anderen Sprachen, in denen eine solche Unterscheidung nicht erhalten bleibt.
quelle
if (n := len(a)) > 10: y = n + 1
Beispiel schreiben . Beachten Sie, dass die Unterscheidung aufgrund der Einführung eines neuen Operators für diesen Zweck klar ist (:=
)TL; DR
Python hat keine unären Inkrementierungs- / Dekrementierungsoperatoren (
--
/++
). Verwenden Sie stattdessen, um einen Wert zu erhöhenMehr Details und Fallstricke
Aber sei hier vorsichtig. Wenn Sie aus C kommen, ist auch dies in Python anders. Python hat keine "Variablen" in dem Sinne wie C, stattdessen verwendet Python Namen und Objekte und in Python
int
sind sie unveränderlich.Nehmen wir an, Sie tun es
In Python bedeutet dies: Erstellen Sie ein Objekt vom Typ
int
mit Wert1
und binden Sie den Namena
daran. Das Objekt ist eine Instanzint
mit Wert1
, und der Namea
verweist darauf. Der Namea
und das Objekt, auf das es sich bezieht, sind unterschiedlich.Nehmen wir jetzt an, Sie tun es
Da
int
s unveränderlich sind, geschieht hier Folgendes:a
auf das verwiesen wird (es ist eineint
mit ID0x559239eeb380
).0x559239eeb380
(es ist1
)int
Objekt mit Wert2
(es hat Objekt-ID0x559239eeb3a0
)a
an dieses neue Objekta
Bezieht sich jetzt auf das Objekt0x559239eeb3a0
und das ursprüngliche Objekt (0x559239eeb380
) wird nicht mehr mit dem Namen bezeichneta
. Wenn keine anderen Namen auf das ursprüngliche Objekt verweisen, wird der Müll später gesammelt.Probieren Sie es selbst aus:
quelle
Ja, ich habe auch ++ und - Funktionalität vermisst. Ein paar Millionen Zeilen C-Code haben diese Art des Denkens in meinem alten Kopf verankert, und anstatt dagegen anzukämpfen ... Hier ist eine Klasse, die ich zusammengeschustert habe und die Folgendes implementiert:
Hier ist es:
Sie könnten es so verwenden:
... bereits mit c, könnten Sie dies tun ...
....oder nur...
... und für die (Neu-) Zuordnung in eine Ganzzahl ...
... während dies c als Typzähler beibehält:
BEARBEITEN:
Und dann gibt es dieses unerwartete (und völlig unerwünschte) Verhalten .
... weil in diesem Tupel getitem () nicht verwendet wird, sondern ein Verweis auf das Objekt an die Formatierungsfunktion übergeben wird. Seufzer. Damit:
... oder wörtlicher und expliziter, was wir eigentlich wollten, obwohl dies in tatsächlicher Form durch die Ausführlichkeit entgegengesetzt wird (
c.v
stattdessen verwenden) ...quelle
In Python gibt es keine Post / Pre-Inkrement- / Dekrement-Operatoren wie in Sprachen wie C.
Wir können sehen
++
oder--
als mehrere Zeichen multiplizieren, wie wir es in Mathe (-1) * (-1) = (+1) tun.Z.B
Analysiert als
Was übersetzt bedeutet
Denn Multiplikation von
-
Vorzeichen mit-
Vorzeichen ist+
Und schlussendlich,
quelle
-----count
.In Python 3.8+ können Sie Folgendes tun:
Damit kann man viel nachdenken.
Oder wenn Sie etwas mit einer ausgefeilteren Syntax schreiben möchten (das Ziel ist nicht die Optimierung):
Es gibt gut 0 zurück, wenn ein nicht fehlerfrei existiert, und setzt es dann auf 1
quelle