¿Por qué no hay operadores ++ y -- en Python?


¿Por qué no hay operadores ++ y -- en Python?

Author: animuson, 2010-09-07

17 answers

No es porque no tenga sentido; tiene perfecto sentido definir "x++" como "x += 1, evaluando el enlace anterior de x".

Si quieres saber la razón original, tendrás que vadear a través de las viejas listas de correo de Python o preguntar a alguien que estuvo allí (por ejemplo. Guido), pero es bastante fácil de justificar después del hecho:

El simple incremento y decremento no son necesarios tanto como en otros idiomas. No escribes cosas como for(int i = 0; i < 10; ++i) en Python muy a menudo; en su lugar hacer cosas como for i in range(0, 10).

Dado que no se necesita tan a menudo, hay muchas menos razones para darle su propia sintaxis especial; cuando necesita incrementar, += generalmente está bien.

No es una decisión de si tiene sentido, o si se puede hacer does lo hace, y puede. Es una cuestión de si vale la pena agregar el beneficio a la sintaxis principal del lenguaje. Recuerde, esto es cuatro operadores post postinc, postdec, preinc, predec, y cada uno de ellos necesitaría para tener sus propias sobrecargas de clase; todas necesitan ser especificadas, y probadas; añadiría opcodes al lenguaje (implicando un motor de VM más grande, y por lo tanto más lento); cada clase que soporte un incremento lógico necesitaría implementarlas (encima de += y -=).

Todo esto es redundante con += y -=, por lo que se convertiría en una pérdida neta.

 380
Author: Glenn Maynard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-06 23:57:42

Esta respuesta original que escribí es un mito del folclore de la computación: desacreditado por Dennis Ritchie como "históricamente imposible" como se indica en las cartas a los editores de Comunicaciones de la ACM Julio 2012 doi:10.1145/2209249.2209251


Los operadores de incremento/decremento de C se inventaron en un momento en que el compilador de C no era muy inteligente y los autores querían poder especificar la intención directa de que se usara un operador de lenguaje máquina que guardó un puñado de ciclos para un compilador que podría hacer un

load memory
load 1
add
store memory

En lugar de

inc memory 

Y el PDP-11 incluso soportaba instrucciones de "autoincremento" y "autoincremento diferido" correspondientes a *++p y *p++, respectivamente. Consulte la sección 5.3 de el manual si es terriblemente curioso.

Como los compiladores son lo suficientemente inteligentes como para manejar los trucos de optimización de alto nivel incorporados en la sintaxis de C, ahora son solo una conveniencia sintáctica.

Python no tiene trucos para transmitir intenciones al ensamblador porque no usa uno.

 78
Author: msw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-07 16:48:33

Siempre asumí que tenía que ver con esta línea del zen de python:

Debe haber una - y preferiblemente solo una - forma obvia de hacerlo.

X++ y x+=1 hacen exactamente lo mismo, por lo que no hay razón para tener ambos.

 52
Author: GSto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-03 00:22:39

Por supuesto, podríamos decir "Guido acaba de decidir de esa manera", pero creo que la pregunta es realmente acerca de las razones de esa decisión. Creo que hay varias razones:

  • Mezcla declaraciones y expresiones, lo cual no es una buena práctica. Véase http://norvig.com/python-iaq.html
  • Generalmente anima a la gente a escribir código menos legible
  • Complejidad adicional en la implementación del lenguaje, que es innecesaria en Python, ya que mencionado
 36
Author: EMP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-07 00:28:13

Porque, en Python, los enteros son inmutables (int's += en realidad devuelve un objeto diferente).

También, con ++ / you necesita preocuparse por pre - versus post - incremento/decremento, y solo necesita una tecla más para escribir x+=1. En otras palabras, evita posibles confusiones a expensas de muy pocos beneficios.

 13
Author: Nathan Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-07 00:25:03

Claridad!

Python tiene mucho que ver con claridad y es probable que ningún programador adivine correctamente el significado de --a a menos que haya aprendido un lenguaje que tenga esa construcción.

Python también trata mucho de evitar construcciones que inviten a errores y los operadores ++ son conocidos por ser ricas fuentes de defectos. Estas dos razones son suficientes para no tener esos operadores en Python.

La decisión de que Python usa sangría para marcar bloques en lugar que medios sintácticos como alguna forma de bracketing de inicio/fin o el marcado final obligatorio se basa en gran medida en las mismas consideraciones.

Como ilustración, eche un vistazo a la discusión sobre la introducción de un operador condicional (en C: cond ? resultif : resultelse) en Python en 2005. Lea al menos el primer mensaje y el mensaje de decisión de ese debate (que anteriormente tenía varios precursores sobre el mismo tema).

Curiosidades: El PEP con frecuencia allí se menciona la "Propuesta de Extensión de Python" PEP 308 . LC significa list comprehension, GE significa generator expression (y no te preocupes si eso te confunde, no son ninguno de los pocos puntos complicados de Python).

 12
Author: Lutz Prechelt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-16 17:27:54

Fue diseñado de esa manera. Los operadores de incremento y decremento son solo atajos para x = x + 1. Python ha adoptado típicamente una estrategia de diseño que reduce el número de medios alternativos para realizar una operación. La asignación aumentada es lo más cercano a los operadores de incremento/decremento en Python, y ni siquiera se agregaron hasta Python 2.0.

 9
Author: Reed Copsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-06 23:37:27

Soy muy nuevo en python pero sospecho que la razón es por el énfasis entre objetos mutables e inmutables dentro del lenguaje. Ahora, sé que x++ se puede interpretar fácilmente como x = x + 1, pero parece que estás incrementando in-place un objeto que podría ser inmutable.

Solo mi conjetura/sentimiento/corazonada.

 8
Author: mkoistinen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-07 00:11:00

Mi comprensión de por qué python no tiene el operador ++ es la siguiente: Cuando escribes esto en python a=b=c=1 obtendrás tres variables (etiquetas) apuntando al mismo objeto (cuyo valor es 1). Puede verificar esto usando la función id que devolverá una dirección de memoria de objeto:

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

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

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

Las tres variables (etiquetas) apuntan al mismo objeto. Ahora incrementar uno de variable y ver cómo afecta a las direcciones de memoria:

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

Puede ver que la variable a ahora apunta a otro objeto como variables b y c. Porque has usado a = a + 1 es explícitamente claro. En otras palabras, asigna completamente otro objeto a label a. Imagine que puede escribir a++ sugeriría que no asignó a variable a un nuevo objeto, sino que ratter incrementa el antiguo. Todo esto es en mi humilde opinión para minimizar la confusión. Para una mejor comprensión, vea cómo funcionan las variables de python:

En Python, ¿por qué una función puede modificar algunos argumentos percibidos por ¿el que llama, pero no otros?

Es Python, llamada por valor o llamada por referencia? Ni.

¿Pasa Python por valor o por referencia?

¿Python pasa por referencia o pasa por valor?

Python: ¿Cómo paso una variable por referencia?

Comprender las variables de Python y la Administración de Memoria

Emulando el comportamiento de paso por valor en python

Python funciones llamadas por referencia

Código como un Pythonista: Python Idiomático

 7
Author: Wakan Tanka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:25:55

Creo que se deriva del credo de Python que "lo explícito es mejor que lo implícito".

 4
Author: Sepheus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-07 10:15:14

Primero, Python solo está influenciado indirectamente por C; está fuertemente influenciado por ABC, que aparentemente no tiene estos operadores, por lo que no debería ser una gran sorpresa no encontrarlos en Python tampoco.

En segundo lugar, como otros han dicho, el incremento y el decremento ya están soportados por += y -=.

En tercer lugar, el soporte completo para un conjunto de operadores ++ y -- generalmente incluye el soporte de las versiones prefijo y postfijo de ellos. En C y C++, esto puede llevar a todo tipo de construcciones" encantadoras " que parecen (para mí) estar en contra del espíritu de simplicidad y franqueza que Python abraza.

Por ejemplo, mientras que la instrucción C while(*t++ = *s++); puede parecer simple y elegante para un programador experimentado, para alguien que la está aprendiendo, es cualquier cosa menos simple. Agrega una mezcla de incrementos y decrementos de prefijo y postfijo, e incluso muchos profesionales tendrán que detenerse y pensar un poco.

 4
Author: wberry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-12 18:04:48

Esto puede ser porque @GlennMaynard está mirando el asunto como en comparación con otros lenguajes, pero en Python, haces las cosas a la manera de Python. No es una pregunta de por qué. Está ahí y puedes hacer cosas con el mismo efecto con x+=. En El Zen de Python, se da: "solo debería haber una manera de resolver un problema."Las opciones múltiples son grandes en el arte (libertad de expresión) pero pésimas en la ingeniería.

 3
Author: Nihal Sahu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:28

Como lo entendí, no pensarás que el valor en memoria cambia. en c cuando haces x++ el valor de x en memoria cambia. pero en python todos los números son inmutables por lo tanto la dirección que x señaló como todavía tiene x no x+1. cuando escribe x++ pensaría que x cambia lo que realmente sucede es que x refrence se cambia a una ubicación en la memoria donde x+1 se almacena o recrear esta ubicación si doe no existe.

 2
Author: rafi wiener,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-17 14:41:19

La clase de operadores ++ son expresiones con efectos secundarios. Esto es algo que generalmente no se encuentra en Python.

Por la misma razón, una asignación no es una expresión en Python, evitando así el lenguaje común if (a = f(...)) { /* using a here */ }.

Por último sospecho que hay operador no son muy consistentes con la semántica de referencia de Pitones. Recuerde, Python no tiene variables (o punteros) con la semántica conocida de C/C++.

 2
Author: Ber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-12 09:51:04

Tal vez una mejor pregunta sería preguntar por qué existen estos operadores en los operadores de incremento y decremento de llamadas de C. K&R 'inusuales' (Sección 2.8 página 46). La Introducción los llama "más concisos y a menudo más eficientes". Sospecho que el hecho de que estas operaciones siempre surgen en la manipulación del puntero también ha jugado un papel en su introducción. En Python probablemente se ha decidido que no tenía sentido tratar de optimizar incrementos (de hecho acabo de hacer una prueba en C, y parece que que el ensamblado generado por gcc usa addl en lugar de incl en ambos casos) y no hay aritmética de puntero; por lo que habría sido solo Una Forma Más de Hacerlo y sabemos que Python detesta eso.

 1
Author: Ludovico Fischer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-07 00:11:43

Para completar ya buenas respuestas en esa página:

Supongamos que decidimos hacer esto, prefijo (++i) que rompería los operadores unarios + y -.

Hoy, el prefijo por ++ o -- no hace nada, porque habilita el operador unario más dos veces (no hace nada) o unario menos dos veces (dos veces: se cancela a sí mismo)

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

Así que eso potencialmente rompería esa lógica.

 0
Author: Jean-François Fabre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-26 09:00:38

El operador

++ no es exactamente el mismo operador+=. De hecho, el resultado de ambos es el mismo, pero los usos tienen alguna diferencia. Por ejemplo, puede usar el operador ++ en condicional ternario, bucle for, etc, pero no puede usar +=. En el fondo, Sentimos la necesidad ++ y--, por esta razón.

 -3
Author: Coker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-12 09:34:43