Warum gibt es keine ++
y --
Operatoren in Python?
Antworten
Zu viele Anzeigen?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.
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.
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
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.
- See previous answers
- Weitere Antworten anzeigen