514 Stimmen

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

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

508voto

Glenn Maynard Punkte 53282

Es liegt nicht daran, dass es keinen Sinn macht; es ist absolut sinnvoll, "x++" als "x += 1, Auswertung der vorherigen Bindung von x" zu definieren.

Wenn Sie den ursprünglichen Grund wissen wollen, müssen Sie sich entweder durch alte Python-Mailinglisten wühlen oder jemanden fragen, der dabei war (z.B. Guido), aber es ist einfach genug, es im Nachhinein zu rechtfertigen:

Einfaches Inkrement und Dekrement werden nicht so oft benötigt wie in anderen Sprachen. Man schreibt keine Dinge wie for(int i = 0; i < 10; ++i) in Python sehr häufig; stattdessen tun Sie Dinge wie for i in range(0, 10) .

Da es nicht so oft benötigt wird, gibt es viel weniger Grund, ihm eine eigene Syntax zu geben; wenn man es aber doch braucht, ist es ein Inkrement, += ist in der Regel völlig in Ordnung.

Es geht nicht um die Frage, ob es sinnvoll ist oder ob es möglich ist - es ist sinnvoll und es ist möglich. Es geht um die Frage, ob der Nutzen es wert ist, die Kernsyntax der Sprache zu erweitern. Denken Sie daran, dies ist vier Operatoren - postinc, postdec, preinc, predec, und jeder dieser Operatoren müsste seine eigenen Klassenüberladungen haben; sie alle müssen spezifiziert und getestet werden; es würde Opcodes zur Sprache hinzufügen (was eine größere und daher langsamere VM-Engine bedeuten würde); jede Klasse, die ein logisches Inkrement unterstützt, müsste sie implementieren (zusätzlich zu += y -= ).

Das alles ist überflüssig bei += y -= Es würde also ein Nettoverlust entstehen.

92voto

msw Punkte 41469

Diese ursprüngliche Antwort, die ich geschrieben habe, ist ein Mythos aus der Folklore der Computerbranche : von Dennis Ritchie als "historisch unmöglich" entlarvt, wie in den Leserbriefen an die Redaktion von Mitteilungen der ACM Juli 2012 doi:10.1145/2209249.2209251


Die C-Inkrement/Dekrement-Operatoren wurden zu einer Zeit erfunden, als der C-Compiler noch nicht sehr intelligent war und die Autoren in der Lage sein wollten, die direkte Absicht zu spezifizieren, dass ein Maschinensprachoperator verwendet werden sollte, was eine Handvoll Zyklen für einen Compiler sparte, der vielleicht eine

load memory
load 1
add
store memory

anstelle von

inc memory 

und die PDP-11 unterstützte sogar "Autoinkrement"- und "Autoinkrement deferred"-Befehle, die den *++p y *p++ . Siehe Abschnitt 5.3 von das Handbuch wenn auch furchtbar neugierig.

Da die Compiler intelligent genug sind, um die in die Syntax von C eingebauten Optimierungstricks auf hoher Ebene zu handhaben, sind sie nur noch eine syntaktische Bequemlichkeit.

Python hat keine Tricks, um dem Assembler seine Absichten mitzuteilen, weil es keine verwendet.

68voto

GSto Punkte 40158

Ich habe immer angenommen, dass es mit dieser Zeile aus dem Zen von Python zu tun hat:

Es sollte einen - und vorzugsweise nur einen - offensichtlichen Weg geben, dies zu tun.

x++ und x+=1 bewirken genau das Gleiche, so dass es keinen Grund gibt, beide zu haben.

43voto

EMP Punkte 54832

Natürlich könnte man sagen: "Guido hat sich einfach so entschieden", aber ich denke, die Frage ist wirklich nach den Gründen für diese Entscheidung. Ich denke, es gibt mehrere Gründe:

  • Er vermischt Aussagen und Ausdrücke, was keine gute Praxis ist. Siehe http://norvig.com/python-iaq.html
  • Es ermutigt die Leute im Allgemeinen, weniger lesbaren Code zu schreiben.
  • Zusätzliche Komplexität in der Sprachimplementierung, die, wie bereits erwähnt, in Python unnötig ist

20voto

Nathan Davis Punkte 5198

Denn in Python sind ganze Zahlen unveränderlich (int's += gibt tatsächlich ein anderes Objekt zurück).

Außerdem müssen Sie sich bei ++/-- um die Vor- und Nacherhöhung bzw. -verringerung kümmern, und es ist nur ein weiterer Tastendruck nötig, um zu schreiben x+=1 . Mit anderen Worten: Es wird eine mögliche Verwirrung auf Kosten eines sehr geringen Gewinns vermieden.

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