Noté que se puede aplicar un operador de pre-incremento / decremento en una variable (como ++count). ¡Compila, pero en realidad no cambia el valor de la variable!
¿Cuál es el comportamiento de los operadores de pre-incremento / decremento (++ / -) en Python?
¿Por qué Python se desvía del comportamiento de estos operadores visto en C / C ++?

++y--operadores?sta x++... la instrucción atómica que resulta almacena elaacumulador dondexestá apuntando, luego aumentaxsegún el tamaño del acumulador. Esto se hace porque es más rápido que la aritmética de puntero, porque es muy común y porque es fácil de entender. Tanto antes como después.Respuestas:
++No es un operador. Son dos+operadores. El+operador es el operador de identidad , que no hace nada. (Aclaración: los operadores unarios+y-únicos solo funcionan en números, pero supongo que no esperarías que un++operador hipotético trabaje en cadenas).Parses como
Lo que se traduce en
Tienes que usar el
+=operador un poco más largo para hacer lo que quieres hacer:Sospecho que los operadores
++y--se quedaron fuera por coherencia y simplicidad. No sé el argumento exacto que Guido van Rossum dio para la decisión, pero puedo imaginar algunos argumentos:++countes ambigua, ya que podría ser+,+,count(dos unarios+operadores) tan fácilmente como podría ser++,count(uno unario++operador). No es una ambigüedad sintáctica significativa, pero existe.++no es más que sinónimo de+= 1. Fue una taquigrafía inventada porque los compiladores de C eran estúpidos y no sabían cómo optimizara += 1laincinstrucción que tienen la mayoría de las computadoras. En este día de optimización de compiladores y lenguajes interpretados por código de bytes, generalmente se desaprueba agregar operadores a un lenguaje para permitir que los programadores optimicen su código, especialmente en un lenguaje como Python que está diseñado para ser coherente y legible.++operadores es mezclar las diferencias (tanto en precedencia como en valor de retorno) entre los operadores de incremento / decremento previo y posterior, y a Python le gusta eliminar el lenguaje "gotcha" -s. Los problemas de precedencia del incremento previo / posterior en C son bastante complicados e increíblemente fáciles de confundir.fuente
+operador unario tiene un uso. Para objetos decimales Decimales, se redondea a la precisión actual.+ +y++sin romper LL (1).++no es más que un sinónimo de+= 1. Hay variantes de incremento previo y posterior de ++, por lo que claramente no es lo mismo. Sin embargo, estoy de acuerdo con el resto de tus puntos.Cuando desea aumentar o disminuir, normalmente desea hacerlo en un número entero. Al igual que:
Pero en Python, los enteros son inmutables . Es que no puedes cambiarlos. Esto se debe a que los objetos enteros se pueden usar con varios nombres. Prueba esto:
ayb anteriores son en realidad el mismo objeto. Si incrementaras a, también incrementarías b. Eso no es lo que quieres. Entonces tienes que reasignar. Me gusta esto:
O más simple:
Que reasignará
bab+1. Ese no es un operador de incremento, porque no incrementab, lo reasigna.En resumen: Python se comporta de manera diferente aquí, porque no es C, y no es un contenedor de bajo nivel alrededor del código de máquina, sino un lenguaje dinámico de alto nivel, donde los incrementos no tienen sentido, y tampoco son tan necesarios como en C , donde los usa cada vez que tiene un bucle, por ejemplo.
fuente
i++significaría asignari + 1a la variablei.i = 5; i++significa asignar6ai, no modificar elintobjeto señalado pori. Es decir, no significa incrementar el valor de5!i++solo funciona con valores. Si se pretendiera incrementar el objeto señalado pori, esta restricción sería innecesaria.Si bien las otras respuestas son correctas en la medida en que muestran lo que
+generalmente hace un simple (es decir, dejar el número como está, si es uno), están incompletas en la medida en que no explican lo que sucede.Para ser exactos,
+xevalúa ax.__pos__()y++xax.__pos__().__pos__().Me imagino una estructura de clase MUY extraña (¡Niños, no hagan esto en casa!) Como esta:
fuente
Python no tiene estos operadores, pero si realmente los necesita, puede escribir una función que tenga la misma funcionalidad.
Uso:
Dentro de una función, debe agregar locales () como segundo argumento si desea cambiar la variable local, de lo contrario, intentará cambiar global.
También con estas funciones puedes hacer:
Pero en mi opinión, el siguiente enfoque es mucho más claro:
Operadores de decremento:
Usé estas funciones en mi módulo traduciendo javascript a python.
fuente
Wikipedia
Entonces, al introducir dichos operadores, rompería la división expresión / declaración.
Por la misma razón que no puedes escribir
como puede en otros idiomas donde no se conserva esa distinción.
fuente
if (n := len(a)) > 10: y = n + 1por ejemplo. Tenga en cuenta que la distinción es clara debido a la introducción de un nuevo operador para ese propósito (:=)TL; DR
Python no tiene operadores de incremento / decremento unarios (
--/++). En cambio, para incrementar un valor, useMás detalles y gotchas
Pero ten cuidado aquí. Si vienes de C, incluso esto es diferente en Python. Python no tiene "variables" en el sentido de que C sí, sino que usa nombres y objetos , y en python
ints son inmutables.así que digamos que lo haces
Lo que esto significa en python es: crear un objeto de tipo que
inttenga valor1y vincularlo con el nombrea. El objeto es una instancia deinttener valor1, y el nombre searefiere a él. El nombreay el objeto al que se refiere son distintos.Ahora digamos que lo haces
Como
ints son inmutables, lo que sucede aquí es lo siguiente:arefiere (es unintcon id0x559239eeb380)0x559239eeb380(es1)intobjeto con valor2(tiene id de objeto0x559239eeb3a0)aa este nuevo objetoarefiere al objeto0x559239eeb3a0y0x559239eeb380el nombre ya no hace referencia al objeto original ( )a. Si no hay otros nombres que se refieran al objeto original, se recolectará basura más tarde.Pruébalo tú mismo:
fuente
Sí, me perdí la funcionalidad ++ y - también. Unos pocos millones de líneas de código c graban ese tipo de pensamiento en mi vieja cabeza, y en lugar de luchar contra él ... Aquí hay una clase que improvisé que implementa:
Aquí está:
Puede usarlo así:
... ya teniendo c, podrías hacer esto ...
....o solo...
... y para (re) asignación en entero ...
... mientras que esto mantendrá c como contador de tipo:
EDITAR:
Y luego está este comportamiento inesperado (y completamente no deseado) ,
... porque dentro de esa tupla, getitem () no es lo que se usó, sino que se pasa una referencia al objeto a la función de formateo. Suspiro. Entonces:
... o, más detalladamente, y explícitamente lo que realmente queríamos que sucediera, aunque la verbosidad lo contrarresta en forma real (use
c.ven su lugar) ...fuente
No hay operadores post / pre incremento / decremento en python como en lenguajes como C.
Podemos ver
++o--multiplicar signos múltiples, como lo hacemos en matemáticas (-1) * (-1) = (+1).P.ej
Parses como
Lo que se traduce en
Porque, la multiplicación de
-signo con-signo es+Y finalmente,
fuente
-----count.En python 3.8+ puedes hacer:
Puedes pensar mucho con esto.
O si desea escribir algo con una sintaxis más sofisticada (el objetivo no es la optimización):
Bien devuelve 0 si no existe un error sin errores, y luego lo establecerá en 1
fuente