En el ejemplo, x is zdevuelve False. Pero si a xyz se les asignan los mismos valores en lugar de listas (por ejemplo x, z = 13, 13), entonces x is zretorna True. ¿Porqué es eso?
Proyecto de ley
12
@Bill: Ese es un artefacto de cómo Python maneja los ints. Python asigna objetos enteros a los que xy zapuntan. Dado que los números enteros pequeños son un error común (-1 como valor de error, 0 cada vez que indexa algo, los números pequeños suelen ser valores predeterminados razonables) Python optimiza preasignando números pequeños (-5 a 256) y reutiliza el mismo objeto entero. Por lo tanto, su ejemplo solo funciona para números en este rango. Intente asignar algo más grande, es decir 270. Para obtener más información, consulte aquí
ted
1
@AndresR No, eso está mal. iscomprueba si dos nombres hacen referencia a la misma ubicación de memoria. No tiene nada que ver con el objeto en sí. Es fácil tener objetos inmutables como cadenas que son iguales pero que no se almacenan en la misma ubicación, por ejemplo, ''a'*10000 is 'a' * 10000es Falso.
Jochen Ritzel
1
@JochenRitzel Tienes toda la razón, ¡gracias por este comentario! Entonces, no entiendo qué está pasando con "af" is "af"o () is ()... ¿por qué comparten la misma ubicación de memoria?
AndresR
2
@AndreasR Para cadenas / números literales en el código, el compilador verifica que existan solo una vez y los reutiliza. Los valores especiales como (), Ninguno, Verdadero, Falso, etc. también se definen como singletons. Durante la ejecución, el tiempo de ejecución también intenta reutilizar pequeños números y cadenas, pero al final es una compensación entre la velocidad y la memoria y lo que sucede depende de cómo se implementó el tiempo de ejecución de Python.
Si bien las dos soluciones correctas x is zy id(x) == id(z)ya se han publicado, quiero señalar un detalle de implementación del pitón. Python almacena enteros como objetos, como optimización genera un montón de pequeños enteros al principio (-5 a 256) y apunta CADA variable que contiene un entero con un valor pequeño a estos objetos preinicializados.Más información
Esto significa que para los objetos enteros inicializados con los mismos números pequeños (-5 a 256), la verificación de si dos objetos son iguales devolverá verdadero ( ON C-Pyhon , hasta donde yo sé, esto es un detalle de implementación ), mientras que para los más grandes números, esto solo devuelve verdadero si un objeto se inicializa del otro.
> i =13> j =13> i is j
True> a =280> b =280> a is b
False> a = b
> a
280> a is b
True
Esto es de docs.python.org: "Cada objeto tiene una identidad, un tipo y un valor. La identidad de un objeto nunca cambia una vez que ha sido creado; puede pensar en él como la dirección del objeto en la memoria. El operador 'es' compara la identidad de dos objetos; la función id () devuelve un número entero que representa su identidad ".
Aparentemente, cada vez que cambia el valor, el objeto se recrea como lo indica el cambio de identidad. La línea x = 3 seguida de la línea x = 3,14 no da error y da diferentes identidades, tipos y valores para x.
Respuestas:
Para eso
is
es:x is y
devuelveTrue
six
yy
son el mismo objeto.fuente
x is z
devuelveFalse
. Pero si a xyz se les asignan los mismos valores en lugar de listas (por ejemplox, z = 13, 13
), entoncesx is z
retornaTrue
. ¿Porqué es eso?x
yz
apuntan. Dado que los números enteros pequeños son un error común (-1 como valor de error, 0 cada vez que indexa algo, los números pequeños suelen ser valores predeterminados razonables) Python optimiza preasignando números pequeños (-5 a 256) y reutiliza el mismo objeto entero. Por lo tanto, su ejemplo solo funciona para números en este rango. Intente asignar algo más grande, es decir270
. Para obtener más información, consulte aquíis
comprueba si dos nombres hacen referencia a la misma ubicación de memoria. No tiene nada que ver con el objeto en sí. Es fácil tener objetos inmutables como cadenas que son iguales pero que no se almacenan en la misma ubicación, por ejemplo,''a'*10000 is 'a' * 10000
es Falso."af" is "af"
o() is ()
... ¿por qué comparten la misma ubicación de memoria?y is x
seráTrue
,y is z
seráFalse
.fuente
Si bien las dos soluciones correctas
x is z
yid(x) == id(z)
ya se han publicado, quiero señalar un detalle de implementación del pitón. Python almacena enteros como objetos, como optimización genera un montón de pequeños enteros al principio (-5 a 256) y apunta CADA variable que contiene un entero con un valor pequeño a estos objetos preinicializados.Más informaciónEsto significa que para los objetos enteros inicializados con los mismos números pequeños (-5 a 256), la verificación de si dos objetos son iguales devolverá verdadero ( ON C-Pyhon , hasta donde yo sé, esto es un detalle de implementación ), mientras que para los más grandes números, esto solo devuelve verdadero si un objeto se inicializa del otro.
fuente
También puede usar id () para verificar a qué objeto único se refiere cada nombre de variable.
fuente
Realmente me gusta tener una retroalimentación visual, por eso a veces abro http://www.pythontutor.com/visualize.html#mode=edit para ver cómo se asigna la memoria y qué hace referencia a qué.
Se agregó este increíble gif ya que esta respuesta trata sobre visualizar ...
fuente
Esto es de docs.python.org: "Cada objeto tiene una identidad, un tipo y un valor. La identidad de un objeto nunca cambia una vez que ha sido creado; puede pensar en él como la dirección del objeto en la memoria. El operador 'es' compara la identidad de dos objetos; la función id () devuelve un número entero que representa su identidad ".
Aparentemente, cada vez que cambia el valor, el objeto se recrea como lo indica el cambio de identidad. La línea x = 3 seguida de la línea x = 3,14 no da error y da diferentes identidades, tipos y valores para x.
fuente