Pourquoi n'y a-t-il pas d'opérateurs ++ et -- en Python?

pourquoi n'y a-t-il pas d'opérateurs ++ et -- en Python?

368
demandé sur animuson 2010-09-07 03:29:24
la source

17 ответов

ce n'est pas parce que cela n'a pas de sens; il est parfaitement logique de définir" x++ "comme"x += 1, en évaluant à la liaison précédente de x".

si vous voulez connaître la raison originale, vous devrez soit parcourir les vieilles listes de diffusion de Python ou demander à quelqu'un qui était là (par ex. Guido), mais c'est assez facile à justifier après coup:

Simple incrémentation et de décrémentation ne sont pas nécessaire, car, comme dans bien d'autres langues. Tu n'écris pas des choses comme for(int i = 0; i < 10; ++i) en Python très souvent; au lieu de cela, vous faites des choses comme for i in range(0, 10) .

Puisqu'il n'est pas nécessaire presque aussi souvent, il y a beaucoup moins de raison de lui donner sa propre syntaxe spéciale; quand vous avez besoin d'augmenter, += est généralement très bien.

il ne s'agit pas de décider si cela a du sens, ou si cela peut être fait--c'est le cas, et c'est possible. C'est une question de savoir si l'avantage vaut la peine d'ajouter à la syntaxe de base de la langue. Rappeler, il s'agit de quatre opérateurs-postinc, postdec, preinc, predec, et chacun d'eux aurait besoin d'avoir ses propres surcharges de classe; ils ont tous besoin d'être spécifiés, et testés; il ajouterait des codes op au langage (impliquant un plus grand, et donc plus lent, moteur VM); chaque classe qui soutient un incrément logique devrait les mettre en œuvre (en plus de += et -= ).

tout cela est redondant avec += et -= , donc il deviendrait une perte nette.

380
répondu Glenn Maynard 2010-09-07 03:57:42
la source

cette réponse originale que j'ai écrite est un mythe du folklore de l'informatique : démystifiée par Dennis Ritchie comme "historiquement impossible" comme noté dans les lettres aux éditeurs de Communications de L'ACM juillet 2012 doi: 10.1145 / 2209249.2209251


les opérateurs d'incrément/décrément C ont été inventés à une époque où le compilateur C n'était pas très intelligent et les auteurs voulait être en mesure de spécifier l'intention directe qu'un opérateur de langage machine devrait être utilisé qui a sauvé une poignée de cycles pour un compilateur qui pourrait faire un

load memory
load 1
add
store memory

au lieu de

inc memory 

et le PDP-11 soutenaient même les instructions" auto-injection "et" auto-injection différée "correspondant respectivement à *++p et *p++ . Voir la section 5.3 de le manuel si horriblement curieux.

comme les compilateurs sont assez intelligents pour gérer les trucs d'optimisation de haut niveau intégrés dans la syntaxe de C, ils sont juste une commodité syntaxique maintenant.

Python n'a pas d'astuces pour transmettre les intentions à l'assembleur parce qu'il n'en utilise pas.

78
répondu msw 2014-06-07 20:48:33
la source

j'ai toujours pensé qu'il s'agissait de cette ligne du zen de python:

il devrait y avoir une - et de préférence une seule - façon évidente de le faire.

x++ et x+=1 font exactement la même chose, donc il n'y a aucune raison d'avoir les deux.

52
répondu GSto 2013-11-03 04:22:39
la source

bien sûr, nous pourrions dire" Guido vient de décider de cette façon", mais je pense que la question est vraiment sur les raisons de cette décision. Je pense qu'il y a plusieurs raisons:

  • il mélange des énoncés et des expressions, ce qui n'est pas une bonne pratique. Voir http://norvig.com/python-iaq.html
  • il encourage généralement les gens à écrire un code moins lisible
  • complexité supplémentaire dans la langue implémentation, qui est inutile en Python, comme déjà mentionné
36
répondu EMP 2010-09-07 04:28:13
la source

parce que, en Python, les entiers sont immuables (int's += renvoie en fait un objet différent).

aussi, avec ++/-- vous devez vous soucier de pré - versus post - incrément/décrément, et il suffit d'une touche de plus pour écrire x+=1 . En d'autres termes, elle évite toute confusion potentielle au détriment d'un gain minime.

13
répondu Nathan Davis 2010-09-07 04:25:03
la source

de la Clarté!

Python est beaucoup sur clarté et aucun programmeur est susceptible de deviner correctement le sens de --a à moins qu'il/elle ait appris un langage ayant cette construction.

Python est également beaucoup sur éviter les constructions qui invitent à des erreurs et les opérateurs ++ sont connus pour être des sources riches de défauts. Ces deux raisons sont suffisantes pour ne pas avoir ces opérateurs Python.

la décision que Python utilise l'indentation pour marquer des blocs plutôt que des moyens syntaxiques tels qu'une certaine forme de début/fin bracketing ou le marquage obligatoire des extrémités repose en grande partie sur les mêmes considérations.

par exemple, regardez la discussion autour de l'introduction d'un opérateur conditionnel (en C: cond ? resultif : resultelse ) en Python en 2005. Lire au moins le premier message et le message de décision de ce discussion (qui avait plusieurs précurseurs sur le même sujet auparavant).

anecdote: Le PEP fréquemment mentionné est la "Python Extension Proposal" PEP 308 . LC signifie list comprehension , GE signifie generator expression (et ne vous inquiétez pas si ceux vous confondent, ils ne sont pas de la quelques taches compliquées de Python).

12
répondu Lutz Prechelt 2015-01-16 20:27:54
la source

il a été conçu comme ça. Les opérateurs d'incrément et de décrément ne sont que des raccourcis pour x = x + 1 . Python a typiquement adopté une stratégie de conception qui réduit le nombre de moyens alternatifs pour effectuer une opération. affectation augmentée est la chose la plus proche des opérateurs d'incrément/décrément en Python, et ils n'ont même pas été ajoutés avant Python 2.0.

9
répondu Reed Copsey 2010-09-07 03:37:27
la source

je suis très nouveau en python mais je soupçonne que la raison est en raison de l'accent mis entre les objets mutables et immuables dans le langage. Maintenant, je sais que x++ peut facilement être interprété comme x = x + 1, mais il semble que vous incrémentez en place un objet qui pourrait être immuable.

Juste mon sentiment/sensation/intuition.

8
répondu mkoistinen 2010-09-07 04:11:00
la source

ma compréhension de la raison pour laquelle python n'a pas d'opérateur ++ est la suivante: lorsque vous écrivez ceci en python a=b=c=1 vous obtiendrez trois variables (étiquettes) pointant vers le même objet (dont la valeur est 1). Vous pouvez vérifier cela en utilisant la fonction id qui retournera une adresse de mémoire d'objet:

In [19]: id(a)
Out[19]: 34019256

In [20]: id(b)
Out[20]: 34019256

In [21]: id(c)
Out[21]: 34019256

les trois variables (étiquettes) pointent vers le même objet. Maintenant increment one of variable et voir comment il affecte les adresses mémoire:

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

vous pouvez voir que la variable a pointe maintenant vers un autre objet que les variables b et c . Parce que vous avez utilisé a = a + 1 il est explicitement clair. En d'autres termes, vous assignez complètement un autre objet à l'étiquette a . Imaginez que vous pouvez écrire a++ il suggérerait que vous n'avez pas assigné à la variable a nouvel objet, mais ratter incrémenter l'ancien. Tout ça C'est de L'IMHO pour minimiser la confusion. Pour une meilleure comprendre le fonctionnement des variables python:

en Python, pourquoi une fonction peut-elle modifier certains arguments tels que perçus par l'appelant, mais pas d'autres?

est-ce que Python appelle-par-valeur ou appel-par-référence? Ni.

Python passe-t-il par valeur, ou par référence?

Python par référence ou passage par valeur?

Python: Comment passer une variable par référence?

Compréhension Python variables et Gestion de la Mémoire

Émulation de passer par valeur, le comportement en python

les fonctions Python appellent par référence

Code comme un Pythonista: Python Idiomatique

7
répondu Wakan Tanka 2017-05-23 15:25:55
la source

je crois qu'il découle du Credo Python que"l'explicite vaut mieux que l'implicite".

4
répondu Sepheus 2010-09-07 14:15:14
la source

premièrement, Python n'est influencé qu'indirectement par C; il est fortement influencé par ABC , qui n'a apparemment pas ces opérateurs , donc il ne devrait pas être une grande surprise de ne pas les trouver en Python non plus.

Deuxièmement, comme d'autres l'ont dit, l'accroissement et le décrément sont déjà soutenus par += et -= .

Troisièmement, soutien complet pour un ++ et -- operator set inclut généralement le support des versions préfixées et postfix. En C et C++, cela peut conduire à toutes sortes de "belles" constructions qui semblent (pour moi) être contre l'esprit de simplicité et de franchise que Python embrasse.

par exemple, alors que L'énoncé C while(*t++ = *s++); peut sembler simple et élégant à un programmeur expérimenté, à quelqu'un l'apprenant, il est tout sauf simple. Ajouter un mélange d'incréments de préfixe et de postfix et décréments, et même de nombreux pros devront s'arrêter et réfléchir un peu.

4
répondu wberry 2014-02-12 22:04:48
la source

c'est peut-être parce que @GlennMaynard regarde la question comme en comparaison avec d'autres langues, mais en Python, vous faites les choses à la manière de python. Ce n'est pas un "pourquoi" question. Il est là et vous pouvez faire des choses dans le même sens avec x+= . Dans le Zen de Python , il est donné: "il ne devrait y avoir qu'une seule façon de résoudre un problème."Les choix multiples sont grands dans l'art (liberté d'expression) mais nuls dans l'ingénierie.

3
répondu Nihal Sahu 2017-05-23 14:54:28
la source

comme je l'ai compris donc vous ne penserez pas que la valeur en mémoire est changée. en c quand vous faites x++ la valeur de x dans la mémoire change. mais en python tous les nombres sont immuables d'où l'adresse que X a indiqué comme ayant toujours x et non x+1. quand vous écrivez x++ vous penseriez que X change ce qui se passe vraiment c'est que x refrence est changé en un endroit dans la mémoire où x+1 est stocké ou recréer cet endroit si doe n'existe pas.

2
répondu rafi wiener 2013-07-17 18:41:19
la source

les opérateurs de la classe ++ sont des expressions ayant des effets secondaires. C'est quelque chose que L'on ne trouve généralement pas en Python.

pour la même raison qu'une tâche n'est pas une expression en Python, empêchant ainsi l'idiome commun if (a = f(...)) { /* using a here */ } .

enfin, je soupçonne qu'il n'y a pas d'opérateur compatible avec la sémantique de référence de Pythons. Rappelez-vous, Python n'a pas de variables (ou de pointeurs) avec la sémantique connue de C/C++.

2
répondu Ber 2014-02-12 13:51:04
la source

peut-être une meilleure question serait de se demander pourquoi ces opérateurs existent dans C. K&R appelle les opérateurs d'incrément et de décrément "inhabituels" (Section 2.8 page 46). L'Introduction les appelle "plus concis et souvent plus efficaces". J'imagine que le fait que ces opérations viennent toujours dans la manipulation du pointeur a également joué un rôle dans leur introduction. En Python, il a probablement été décidé que cela n'avait aucun sens d'essayer d'optimiser les incréments (en fait, je viens de faire un test en C, et il il semble que l'Assemblée générée par gcc utilise addl au lieu de incl dans les deux cas) et il n'y a pas de pointeur arithmétique; donc il aurait été juste une autre façon de le faire et nous savons que Python déteste cela.

1
répondu Ludovico Fischer 2010-09-07 04:11:43
la source

pour compléter déjà de bonnes réponses sur cette page:

supposons que nous décidions de le faire, préfixe ( ++i ) qui briserait les opérateurs + et - unaires.

Aujourd'hui, préfixer par ++ ou -- ne fait rien, parce qu'il permet unary plus opérateur deux fois (ne fait rien) ou unary moins deux fois (deux fois: s'annule)

>>> i=12
>>> ++i
12
>>> --i
12

donc ça pourrait briser cette logique.

0
répondu Jean-François Fabre 2017-04-26 12:00:38
la source

++ operator n'est pas exactement le même que l'opérateur+=. En fait, le résultat des deux est le même, mais utilise ont une certaine différence. Par exemple, vous pouvez utiliser ++ operator dans ternary conditional, pour loop, etc mais vous ne pouvez pas utiliser +=. Au fond, Nous sentons le besoin ++ et --, pour cette raison.

-3
répondu Coker 2014-02-12 13:34:43
la source

Autres questions sur python operators