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

InformationsquelleAutor Leonid | 2010-09-06

19 Comentarios

  1. 432

    No es porque no tiene sentido; esto tiene el sentido perfecto para definir la «x++» como «x += 1, la evaluación de la anterior unión de x».

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

    Simple de incremento y decremento no se necesita tanto como en otros idiomas. No escribir cosas como for(int i = 0; i < 10; ++i) en Python muy a menudo; en lugar de hacer las cosas como for i in range(0, 10).

    Dado que no es necesaria tanta frecuencia, hay mucho menos motivo para darle su propia sintaxis especial; cuando se necesita incrementar, += por lo general es correcto.

    No es una decisión de si tiene sentido, o si se puede hacer–sí, y se puede. Es una cuestión de si el beneficio es la pena añadir a la sintaxis básica del lenguaje. Recuerde, este es cuatro operadores–postinc, postdec, preinc, predec, y cada uno de estos tendría que tener su propia clase sobrecargas; todos ellos deben ser especificados, y de la prueba; se podría agregar códigos de operación para el lenguaje (lo que implica un mayor, y por lo tanto más lento, VM motor); cada clase que soporta un lógico incremento sería necesario implementarlas (en la parte superior de += y -=).

    Todo esto es redundante con += y -=, así que sería una pérdida neta.

    • A menudo es útil usar algo como matriz[i++], que no es ordenadamente hecho con +=/-=.
    • Eso no es un patrón común en Python.
    • Ya que va a ser dentro de un bucle, que bien podría recorrer i directamente – si realmente lo necesitan y no sólo puede, por ejemplo, uso array.append()
    • Veo mucho más grande que afectan a la legibilidad y la previsibilidad. De vuelta en mi C días, he visto más que suficiente errores derivados de los malentendidos acerca de la distinción entre i++ y ++i
    • Yo creo en la «C» es el mundo en que se usa con más eficacia (no más comúnmente) con punteros. Existe una correspondencia directa a algunos juegos de instrucciones que soporte pre – o post-incremento de registros de dirección – M68K viene a la mente como un partidario temprano de esta. Puesto que no hay punteros en Python es redundante.
    • Añadir a justificar después del hecho: en un proyecto en el que trabajo, me he encontrado (más que nadie en su vida) una buena cantidad de código C++ que sufren de problemas con ++ y -- ser utilizado en formas que resultan en indefinido o indeterminado comportamiento. Ellos hacen posible la escritura complicada, difícil-a-correctamente-analizar el código.
    • La desagregación de algo como return a[i++] es realmente feo. No se puede reemplazar directamente por i+=1 o i=i+1 y debe cambiar un número de líneas de código.
    • No estoy seguro de si has entendido la respuesta. El punto es que, a diferencia de C, no es necesario el incremento de uno en Python muy a menudo. Si usted encuentra que usted está haciendo todo el tiempo, no podría ser el uso de la lengua completamente todavía (para, xrange, enumerar, etc.).
    • Glenn, no estoy seguro de que has entendido mi comentario. Si usted está usando xrange, enumerate, for, etc cuando no se conoce de antemano el número de elementos para procesar, no puede ser la programación correctamente.
    • Lo siento, eso no tiene sentido. Usted no necesita de postincremento a escribir «para el elemento en some_list», o en la mayoría de los otros casos, normalmente es necesario tener en C.
    • Yo afirmaría que array[i++] es menos doloroso que perder que array[i]++ – el primero, probablemente podría realizarse en otro lugar en el bucle, pero esto último se requiere de la creación de un desechable variable temp y, al menos, dos líneas de código.
    • 1 se trabajan de la misma, no?
    • No hay ninguna razón por la que requieren otros códigos de operación.
    • dentro de iterador return self.vertices[self.current++] – sería agradable.
    • Sé que este es un hilo viejo, pero la situación en la que usted está utilizando una construcción de foreach para recorrer a través de una colección – y por lo tanto no se están brindando los índices, y por lo tanto debe proveer de usted mismo si usted los necesita – es muy común y ++i o i++ es ampliamente utilizado para resolver este problema. Esta situación es especialmente común cuando usted necesita para hacer de cada miembro de una desordenada conjunto único. El trabajo alrededor de esta python ofrece es enumerar, y no veo que se discute lo suficiente en este hilo.

  2. 82

    Esta respuesta original que escribí es un mito del folclore de la informática: desacreditado por Dennis Ritchie como «históricamente imposible» como se indica en las cartas a los editores de Communications of the ACM de julio de 2012 doi:10.1145/2209249.2209251


    La C operadores de incremento/decremento fueron inventados en un tiempo cuando el compilador de C no era muy inteligente y los autores quería ser capaz de especificar la intención directa de que el lenguaje de máquina operador debe utilizar lo que guarda un puñado de ciclos para un compilador que podría hacer un

    load memory
    load 1
    add
    store memory

    lugar de

    inc memory 

    y la PDP-11, incluso apoyado «autoincrement» y «autoincrement diferida» instrucciones correspondientes a *++p y *p++, respectivamente. Consulte la sección 5.3 del el manual si horriblemente curioso.

    Como compiladores son lo suficientemente inteligentes para manejar el alto nivel de optimización de trucos construido en la sintaxis de C, que es simplemente una comodidad sintáctica ahora.

    Python no tiene trucos para transmitir intenciones para el ensamblador porque no usan uno.

    • Javascript tiene ++. No creo que un «truco para transmitir intenciones para el ensamblador.» Además, Python tiene bytecode. Así que creo que la razón es algo más.
    • Este «proporcionar sugerencias para el compilador de negocios» de hecho es un mito. Francamente, es un tonto adición a cualquier idioma, y viola las dos siguientes preceptos: 1. No código de la computadora para leer, el código de otro ingeniero para leer. Y 2. No de código para un ingeniero competente a leer, código para un ingeniero competente para leer mientras agotado a las 3 de la madrugada y saltó sobre la cafeína.
    • Para ser justos, cuando se codifica en un 10 a 30 caracteres por segundo, half-duplex teletipo, que el código para que pueda clave en antes de la próxima semana.
    • Unix y C vio la mayor parte de su desarrollo inicial en el PDP-11 que utiliza increíblemente lento teletipos para la comunicación del usuario. Mientras estás muerto derecha que hoy codificación de la máquina es principalmente tonto, entonces lo que era la interfaz hombre-Máquina que era el cuello de botella. Es difícil imaginar el trabajo que poco a poco si jamás tuvo.
  3. 62

    Yo siempre supuse que tenía que ver con esta línea de el zen de python:

    No deben ser uno y preferiblemente sólo de una manera obvia de hacerlo.

    x + + y x+=1 hacer exactamente lo mismo, así que no hay razón para tener ambos.

    • one-- es cero ?
    • one-- es uno en la frase, pero cero inmediatamente después. Por lo que este «koan’ también indicios de que los operadores de incremento/decremento no están muy claros.
    • Un guión es normalmente escrito en ascii, como dos guiones, pero @VictorK la explicación es más divertido.
    • Si x + + y x+=1 hacer la misma cosa, me puedes decir los valores de (x++) y (x+=1) ? Creo que la última no tiene ningún valor en python, sino pidiendo uno da un error de sintaxis. Me gustaría contar un subconjunto de tipos dentro de una línea de bucle. x++ haría el truco muy bien.
    • pero +=2
    • Si elimina +=, entonces usted no puede hacer las cosas como x += 10. += es un caso más general de ++
    • También: «Explícito es mejor que la implícita».
    • En realidad, «un -» es una en la frase, pero MENOS uno después. Porque ocurre dos veces. Aún más no evidentes 🙂 Aunque, la segunda podría ser predecrementing «obvio»…
    • Definitivamente no es la misma, ya que x+=1 NO es una expresión – es una declaración y no evaluar a nada. Usted no puede hacer cosas como: ‘fila[col++] = a; fila[col++] = b’. Por no hablar de la pre-inc y post-inc cosas que c++ tiene.
    • Estos no son los mismos… ¿cómo puedo hacer «si un++ == 3» con += ?
    • por favor aclarar. Entiendo que estamos hablando de python, pero a=x++; y=(x++); por supuesto, producir el mismo resultado en C.
    • wow… (hace mucho tiempo, ahora..) he de decir sólo lo que Uri dijo, anteriormente.
    • Acerca de x+=1 no ser una expresión? Python, tal vez. Pero en C y C++, creo que todos los trabajos, incluso el extraño compuesto, son expresiones. Que es lo que hace que a=b=c; trabajo en el primer lugar en esos idiomas (junto con la agrupación de derecha a izquierda).
    • x++ y x+=1 no son la misma cosa.
    • Si elimina +=, entonces usted puede hacer cosas como x += 10 todavía. Usted puede hacer x = x + 10.
    • Por esa lógica, += no debería existir, ya que puedes utilizar x = x + n. Pero += es más conveniente. Del mismo modo, ++ es un más conveniente camino de la adición de 1.

  4. 36

    Por supuesto, se podría decir, «Guido acaba de decidir que camino», pero creo que la pregunta es realmente acerca de los motivos de esa decisión. Creo que hay varias razones:

    • Se mezclan afirmaciones y expresiones, que no es una buena práctica. Ver http://norvig.com/python-iaq.html
    • Generalmente se anima a la gente a escribir menos código legible
    • Extra de complejidad en la implementación del lenguaje, que es necesario en el caso de Python, como ya se ha mencionado
    • Me alegro de que alguien finalmente se menciona la declaración de expresión vs aspecto. En C asignación es una expresión y por lo que el operador++. En Python asignación es una declaración, en la si había una ++, que probablemente tendría que ser una sentencia de asignación, (y aún menos útil o necesario).
    • De acuerdo – si fueran declaraciones, entonces por lo menos sería absolutamente absurdo hablar de la diferencia entre el post – y pre – operadores.
  5. 16

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

    También, con ++/– lo que usted necesita preocuparse acerca de la pre – versus post – incremento/decremento, y sólo se necesita uno más de la pulsación de tecla para escribir x+=1. En otras palabras, se evita la posible confusión a expensas de muy poca ganancia.

    • enteros son inmutables en C así. Si usted no lo creo, trate de obtener su compilador de C para generar código para 42++… Algo como esto (la modificación de una constante literal) fue en realidad posible en algunos de los antiguos compiladores de Fortran (o eso he leído): Todos los usos futuros de los que literal en el programa que se iba a ejecutar, a continuación, que realmente tienen un valor diferente. Feliz de depuración!
    • A la derecha. 42 es un literal constante. Las constantes son (o, al menos, debe se) inmutable. Eso no significa que C ints en general son inmutables. Un int en C simplemente designa un lugar en la memoria. Y los bits en ese lugar es muy mutable. Usted puede, por ejemplo, crear una referencia de un int y cambiar el referente de esa referencia. Este cambio es visible en todas las referencias (incluyendo el original int variable) a ese lugar. La misma no es para Python objeto entero.
    • x+=1 no terminan convirtiéndose inc mem. Python se ejecuta una llamada a una función para añadir 1 a una variable; es patético.
  6. 12

    Claridad!

    Python es mucho acerca de claridad y ningún programador es probable que adivinar correctamente el significado de --a a menos que s/él ha aprendido una lengua tiene que construir.

    Python es también mucho acerca de evitando las construcciones que invitan a los errores y la ++ operadores son conocidas por ser ricas fuentes de defectos.
    Estas dos razones son suficientes para no tener los operadores en Python.

    La decisión de que Python utiliza sangría para marcar bloques en lugar
    que sintácticos medios como una forma de comienzo/fin de horquillado
    u obligatorio de final marcado se basa en gran medida en las mismas consideraciones.

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

    Trivia:
    El PEP menciona con frecuencia en el mismo es de la «Extensión de Python Propuesta» PEP 308. LC significa lista de comprensión, GE significa generador de expresión (y no te preocupes si los confunden, son ninguno de los pocos complicado puntos de Python).

  7. 9

    Fue diseñado de esa manera. Operadores de incremento /decremento son atajos para x = x + 1. Python ha adoptado una estrategia de diseño que reduce el número de medios alternativos de realizar una operación. Aumentada la asignación de es la cosa más cercana a los operadores de incremento/decremento en Python, y que no eran ni siquiera se agrega hasta que Python 2.0.

    • Sí compañero, como, usted puede reemplazar return a[i++] con return a[i=i+1].
  8. 8

    Mi comprensión de por qué python no tiene ++ operador es la siguiente: Al escribir esto en python a=b=c=1 obtendrá tres variables (etiquetas) que apunta al mismo objeto (cuyo valor es 1). Usted puede verificar esto usando el id de la función que devolverá un objeto de la memoria dirección:

    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 un incremento de la 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

    Se puede ver que la variable a ahora apunta a otro objeto como variables b y c. Debido a que usted ha utilizado a = a + 1 es clara y explícita. En otras palabras, asignar completamente otro objeto de la etiqueta a. Imagine que usted puede escribir a++ se podría sugerir que usted no asignar a la variable a nuevo objeto, pero ratter incremento de la antigua. Todo esto es mi humilde opinión, para la minimización de confusión. Para una mejor comprensión ver cómo python variables obras:

    En Python, ¿por qué una función de modificar algunos argumentos como es percibido por la persona, pero no a otros?

    Es Python, llamada por valor o llamada por referencia? Ninguno de los dos.

    Qué Python pasar por valor o por referencia?

    Es Python paso por referencia o por valor?

    Python: ¿Cómo puedo pasar una variable por referencia?

    La comprensión de Python variables y la Gestión de la Memoria

    Emulando a pasar-por-valor comportamiento en python

    En Python las funciones de llamada por referencia

    Código Como un Pythonista: Idiomáticas Python

  9. 7

    Yo soy muy nuevo en python, pero sospecho que la razón es debido a que el énfasis entre lo mutable y lo inmutable objetos dentro de la lengua. Ahora, yo sé que x++ puede ser fácilmente interpretado como x = x + 1, pero PARECE que eres el incremento de en el lugar un objeto que podría ser inmutable.

    Sólo mi suposición/sensación/intuición.

    • En este aspecto, x++ está más cerca de x += 1 que x = x + 1, estos dos hacer una diferencia en los objetos mutables.
  10. 4

    Primera, Python es sólo indirectamente influenciado por C; es fuertemente influenciado por la ABC, que al parecer no tiene estos operadores, por lo que no debería haber ninguna gran sorpresa de no encontrar en Python bien.

    En segundo lugar, como han dicho otros, de incremento y decremento son apoyados por += y -= ya.

    Tercero, soporte completo para un ++ y -- operador establecido generalmente incluye el apoyo tanto de las prefijo y postfix versiones de ellos. En C y C++, esto puede dar lugar a todo tipo de «lovely» construcciones que parecen (para mí) contra el espíritu de sencillez y llaneza que Python abraza.

    Por ejemplo, mientras que el C declaración de while(*t++ = *s++); puede parecer simple y elegante para un programador experimentado, para alguien que está aprendiendo, es cualquier cosa menos simple. El tiro en una mezcla de prefijo y postfix incrementos y decrementos, e incluso muchos profesionales se tiene que parar y pensar un poco.

  11. 3

    Creo que se deriva de la de Python credo de que «explícito es mejor que la implícita».

    • Bueno, usted no escribir explícitamente «begin» y «end» declaraciones en Python, ¿verdad? Aunque estoy de acuerdo con la afirmación, creo que hay límites a que. Si bien podemos discutir en el que las fronteras, creo que todos estamos de acuerdo, que hay una línea, que es poco práctico a la cruz. Y, ya que hay muchas opiniones y justificaciones en que la decisión, yo no creo que la elección fue clara. Al menos, no puedo encontrar una fuente, donde se indica explícitamente
  12. 3

    Esto puede ser debido a @GlennMaynard está buscando en la materia como en comparación con otros idiomas, pero en Python, hacer las cosas de python manera. No es un ‘por qué’, pregunta. Está allí y que usted puede hacer cosas para el mismo efecto con x+=. En El Zen de Python, se le da: «sólo debe haber una forma de resolver un problema.» Múltiples opciones que son geniales en el arte (libertad de expresión), pero pésimo en la ingeniería.

  13. 2

    La ++ de la clase de los 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, por lo tanto la prevención de la común if (a = f(...)) { /* using a here */} idioma.

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

    • nada impide llamar a una función con un efecto secundario en una prueba / expresión / comprensión de lista: f(a) donde a es una lista de algunas objeto inmutable.
  14. 1

    Tal vez una mejor pregunta sería preguntar ¿por qué estos operadores existen en C. K&R las llamadas operaciones de incremento y decremento ‘inusual’ (Sección 2.8 de la página 46). La Introducción llama ‘más concisa y, a menudo, más eficientes». Sospecho que el hecho de que estas operaciones siempre en el puntero de la manipulación también ha jugado un papel en su introducción.
    En Python ha sido probablemente decidió que no tenía sentido tratar de optimizar incrementos (de hecho acabo de hacer una prueba en C, y parece que el gcc-ensamblado generado utiliza addl en lugar de incluido en ambos casos) y no hay aritmética de apuntadores; así habría sido sólo Una Forma Más de Hacerlo y sabemos Python odia eso.

  15. 1

    por lo que he entendido es para que no piensen que el valor en la memoria es cambiado.
    en c cuando x++ el valor de x en los cambios en la memoria.
    pero en python todos los números son inmutables por lo tanto la dirección x se ha señalado como todavía tiene x no x+1. cuando se escribe x++ se podría pensar que x cambio de lo que realmente sucede es que x refrence es cambiado a una ubicación en la memoria donde x+1 se almacena o recrear esta ubicación si el doe no existe.

    • Entonces, ¿qué hace este ++ y diferente de += 1?
  16. 1

    Para completar ya buenas respuestas en la página:

    Supongamos que decidimos hacer esto, el prefijo (++i) que vendría a romper el unario operadores + y -.

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

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

    Por lo que potencialmente podría romper esa lógica.

  17. 0

    Creo que esto se relaciona con los conceptos de la mutabilidad e inmutabilidad de los objetos. 2,3,4,5 son inmutables en python. Consulte la imagen de abajo. 2 se ha corregido el id hasta que esta python proceso.

    ¿Por qué no están los operadores ++ y -- en Python?

    x++ esencialmente significa un lugar en incremento, como C. En C, x++ realiza en el lugar de incrementos. Por lo tanto, x=3 y x++ incrementaría 3 en la memoria a 4, a diferencia de python donde 3 aún existe en la memoria.

    Así en python, no es necesario volver a crear un valor en la memoria. Esto puede conducir a la optimización del rendimiento.

    Esto es una suposición basada en la respuesta.

  18. 0

    Sé que este es un hilo viejo, pero el más común de caso de uso para ++i no está cubierto, que es el de la indización manual establece cuando no se proporcionan los índices. Esta situación es ¿por qué python proporciona enumerar()

    Ejemplo : En cualquier idioma, cuando se utiliza una construcción como foreach para recorrer un conjunto – por el bien de el ejemplo vamos a decir incluso que es un desordenado conjunto y se necesita un índice único para todo, para distinguirlos, decir

    i = 0
    stuff = {'a': 'b', 'c': 'd', 'e': 'f'}
    uniquestuff = {}
    for key, val in stuff.items() :
      uniquestuff[key] = '{0}{1}'.format(val, i)
      i += 1

    En casos como este, python ofrece un enumerar método, por ejemplo,

    for i, (key, val) in enumerate(stuff.items()) :
  19. 0

    Otras respuestas han descrito por qué no es necesaria para los iteradores, pero a veces es útil a la hora de asignar a aumentar una variable en línea, usted puede conseguir el mismo efecto mediante tuplas y asignación múltiple:

    b = ++a se convierte en:

    a,b = (a+1,a+1)

    y b = a++ se convierte en:

    a,b = a+1, a

    Python 3.8 presenta la asignación de := operador, lo que nos permite lograrfoo(++a) con

    foo(a:=a+1)

    foo(a++) es todavía difícil de alcanzar, aunque.

Dejar respuesta

Please enter your comment!
Please enter your name here