significa - simbolos en python
Comportamiento diferente en python script y python inactivo? (1)
En el pitón inactivo:
>>> a=1.1
>>> b=1.1
>>> a is b
False
Pero cuando coloco el código en un script y lo ejecuto, obtendré un resultado diferente:
$cat t.py
a=1.1
b=1.1
print a is b
$python t.py
True
¿Por qué pasó esto? Sé que is
compara la id
de dos objetos, entonces ¿por qué los identificadores de dos objetos son iguales / únicos en python script / inactivo?
También encontré que, si uso un int pequeño, por ejemplo 1
, en lugar de 1.1
, el resultado será el mismo tanto en el script de python como en el de python. ¿Por qué las flotas pequeña int y pequeña tienen un comportamiento diferente?
Estoy usando CPython 2.7.5.
Cuando Python ejecuta un archivo de script, el archivo completo se analiza primero. Puede observar que cuando introduce un error de sintaxis en alguna parte: independientemente de dónde esté, evitará que se ejecute ninguna línea.
Entonces, dado que Python analiza primero el archivo, los literales se pueden cargar efectivamente en la memoria. Como Python sabe que estos son constantes, todas las variables que representan esos valores constantes pueden apuntar al mismo objeto en la memoria. Entonces el objeto es compartido.
Esto funciona para ints y flotadores, pero incluso para cuerdas; incluso cuando hay una expresión constante que necesita ser evaluada primero:
a = "foo"
b = "foo"
c = "fo" + "o"
print(a is b)
print(a is c)
Ahora, en IDLE, el comportamiento es muy diferente: como intérprete interactivo, IDLE ejecuta cada línea por separado. Entonces a = 1.1
b = 1.1
se ejecutan en contextos separados, lo que hace que sea imposible (o simplemente muy difícil) descubrir que ambos comparten el mismo valor literal constante y podrían compartir la memoria. Por lo tanto, en su lugar, el intérprete asignará dos objetos diferentes, lo que hace que la verificación de identidad is
incorrecta.
Para enteros pequeños, la situación es un poco diferente. Debido a que se usan a menudo, CPython almacena un conjunto de enteros (en el rango entre -5 y 256) estáticamente y convierte cada valor de estos puntos en el mismo objeto int
. Es por eso que obtienes un resultado diferente para enteros pequeños que para cualquier otro objeto. Ver también las siguientes preguntas: