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 ela
acumulador dondex
está apuntando, luego aumentax
segú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:++count
es 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 += 1
lainc
instrucció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á
b
ab+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 + 1
a la variablei
.i = 5; i++
significa asignar6
ai
, no modificar elint
objeto 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,
+x
evalúa ax.__pos__()
y++x
ax.__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 + 1
por 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
int
s son inmutables.así que digamos que lo haces
Lo que esto significa en python es: crear un objeto de tipo que
int
tenga valor1
y vincularlo con el nombrea
. El objeto es una instancia deint
tener valor1
, y el nombre sea
refiere a él. El nombrea
y el objeto al que se refiere son distintos.Ahora digamos que lo haces
Como
int
s son inmutables, lo que sucede aquí es lo siguiente:a
refiere (es unint
con id0x559239eeb380
)0x559239eeb380
(es1
)int
objeto con valor2
(tiene id de objeto0x559239eeb3a0
)a
a este nuevo objetoa
refiere al objeto0x559239eeb3a0
y0x559239eeb380
el 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.v
en 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