Estaba resolviendo ejercicios de W3School y me encontré con el siguiente:
Python Identity Operators
Mi respuesta inmediata fue: True, pero oh sorpresa cuando el sistema devolvió "Wrong answer". porque?
Explicación de gemini:
Esta es una de las dudas más comunes y fascinantes cuando se empieza a profundizar en Python. La respuesta corta es que Python está diferenciando entre identidad e igualdad.
Para entenderlo, debemos desglosar cómo funcionan los operadores == e is.
1. Igualdad (==) vs. Identidad (is)
En Python, estos dos operadores hacen preguntas muy distintas al intérprete:
==(Igualdad): Pregunta: "¿Tienen estos dos objetos el mismo contenido?". En tu caso,[1, 2] == [1, 2]es True porque ambos son listas con los mismos números.is(Identidad): Pregunta: "¿Son estos dos objetos exactamente el mismo en la memoria?". Es decir, ¿apuntan a la misma dirección física (ID)?
2. ¿Por qué el resultado es False?
Cuando escribes [1, 2], le estás pidiendo a Python que cree un nuevo objeto de tipo lista en la memoria.
Al ejecutar [1, 2] is [1, 2], sucede lo siguiente:
Python crea la primera lista
[1, 2]en una dirección de memoria (llamémosla Dirección A).Python crea la segunda lista
[1, 2]en una dirección de memoria diferente (Dirección B).El operador
iscompara la Dirección A con la Dirección B. Como son distintas, el resultado es False.
Ejemplo con la función id()
Puedes comprobar esto tú mismo usando la función id(), que te da la dirección única de un objeto:
>>lista_a = [1, 2]
>>lista_b = [1, 2]
>>print(id(lista_a)) # Ejemplo: 140523482340
>>print(id(lista_b)) # Ejemplo: 140523482352 (Es diferente)
>>print(lista_a is lista_b) # False
3. ¿Cuándo sería True?
Para que is devuelva True, ambas variables deben apuntar al mismo objeto exacto:
>>lista_a = [1, 2]
>>lista_b = lista_a # No creamos una lista nueva, "copiamos" la referencia
>>print(lista_a is lista_b) # True
El caso extraño de los números pequeños (Interning)
Es posible que te confundas porque con números pequeños sí funciona:
10 is 10 suele ser True.
Esto sucede porque Python, para ahorrar memoria, hace algo llamado interning: guarda una sola copia de los números pequeños (generalmente del -5 al 256) y los reutiliza siempre. Pero con las listas, Python siempre crea objetos nuevos porque son mutables (pueden cambiar).
Regla de oro: Usa siempre
==para comparar valores (como listas, diccionarios o strings) y reservaisúnicamente para comparar conNone(if x is None:) o para comprobar si dos variables son literalmente el mismo objeto.
¿Te gustaría que te explicara qué pasa si intentas hacer lo mismo con "Strings" o por qué con números grandes el comportamiento vuelve a cambiar?
No hay comentarios.:
Publicar un comentario