python

¿Por qué agregar un punto y coma en Python cambia el resultado?



(2)

El operador is comprueba si dos valores son el mismo objeto en la memoria. No está destinado a ser utilizado para verificar la igualdad. Para lo que vale la pena, puedes considerar el hecho de que a veces se vuelve True y, a veces False solo para ser una cuestión de suerte (incluso si no lo es).

Por ejemplo, los resultados son diferentes en una sesión interactiva y en un programa independiente:

$ cat test.py x = 200000; y = 200000 print(x is y) xx = 200000 yy = 200000 print(xx is yy) $ python test.py True True

O tienes este otro ejemplo:

>>> x = 50 + 50; y = 50 + 50 >>> x is y True >>> x = 5000 + 5000; y = 5000 + 5000 >>> x is y False

Esto sucede porque el intérprete almacena en caché números pequeños para que siempre sean el mismo objeto, pero no para números grandes, por lo que ambas adiciones en el segundo caso crean un nuevo objeto 10000 . No tiene nada que ver con el punto y coma.

Encontré un comportamiento extraño con el punto y coma ";" en pitón.

>>> x=20000;y=20000 >>> x is y True >>> x=20000 >>> y=20000 >>> x is y False >>> x=20000; >>> y=20000 >>> x is y False

¿Por qué la primera prueba devuelve "Verdadero" y los demás devuelven "Falso"? Mi versión de Python es 3.6.5.


En el intérprete interactivo, la primera línea de punto y coma se lee y evalúa en una sola pasada. Como tal, el intérprete reconoce que 20000 es el mismo valor int inmutable en cada asignación, y también puede (no tiene que hacerlo, pero lo hace) hacer referencias de x e y al mismo objeto.

El punto importante es que esto es simplemente una optimización que el intérprete interactivo elige hacer; No es algo garantizado por el idioma o alguna propiedad especial de la ; que une dos afirmaciones en una sola.

En los dos ejemplos siguientes, cuando y=20000 se lee y evalúa, x=20000 (con o sin el punto y coma) ya se ha evaluado y olvidado. Como 20000 no está en el rango (-5 a 257) de los valores int asignados previamente, CPython no intenta encontrar otra instancia de 20000 ya en la memoria; simplemente crea uno nuevo para y .