operator logical example and python python-3.x operators

logical - Comprender el operador "es" de Python



python operator (9)

El operador is no coincide con los valores de las variables, sino con las instancias mismas.

que significa realmente?

Decidí dos variables llamadas x e y asignando los mismos valores en ambas variables, pero devuelve falso cuando uso el operador is .

Necesito una aclaración. Aquí está mi código.

x = [1, 2, 3] y = [1, 2, 3] print x is y #It prints false!


Como puede ver aquí a un entero pequeño. Los números superiores a 257 no son pequeños, por lo que se calculan como un objeto diferente.

En este caso, es mejor usar == .

Más información aquí: http://docs.python.org/2/c-api/int.html


Compara la identidad del objeto, es decir, si las variables se refieren al mismo objeto en la memoria. Es como el == en Java o C (al comparar punteros).


Impulsado por una pregunta duplicada , esta analogía podría funcionar:

# - Darling, I want some pudding! # - There is some in the fridge. pudding_to_eat = fridge_pudding pudding_to_eat is fridge_pudding # => True # - Honey, what''s with all the dirty dishes? # - I wanted to eat pudding so I made some. Sorry about the mess, Darling. # - But there was already some in the fridge. pudding_to_eat = make_pudding(ingredients) pudding_to_eat is fridge_pudding # => False


Usted no entendió lo que el operador prueba. Prueba si dos variables apuntan al mismo objeto , no si dos variables tienen el mismo valor.

De la documentación para el operador is :

Los operadores is y is not pruebas para la identidad del objeto: x is y es verdadero si y solo si y son el mismo objeto.

Use el operador == lugar:

print x == y

Esto imprime True . y son dos listas separadas :

x[0] = 4 print y # prints [1, 2, 3] print x == y # prints False

Si usa la función id() , verá que y tienen diferentes identificadores:

>>> id(x) 4401064560 >>> id(y) 4401098192

pero si asignas y a x , ambos apuntan al mismo objeto:

>>> x = y >>> id(x) 4401064560 >>> id(y) 4401064560 >>> x is y True

y is muestra que ambos son el mismo objeto, regresa True .


X apunta a una matriz, Y apunta a una matriz diferente. Esas matrices son idénticas, pero el operador is mirará esos punteros, que no son idénticos.


solo devuelve verdadero si en realidad son el mismo objeto. Si fueran iguales, un cambio en uno también aparecería en el otro. Aquí hay un ejemplo de la diferencia.

>>> x = [1, 2, 3] >>> y = [1, 2, 3] >>> print x is y False >>> z = y >>> print y is z True >>> print x is z False >>> y[0] = 5 >>> print z [5, 2, 3]


Otro duplicado fue preguntar por qué dos cadenas iguales generalmente no son idénticas, lo que realmente no se responde aquí:

>>> x = ''a'' >>> x += ''bc'' >>> y = ''abc'' >>> x == y True >>> x is y False

Entonces, ¿por qué no son la misma cadena? Especialmente dado esto:

>>> z = ''abc'' >>> w = ''abc'' >>> z is w True

Dejemos la segunda parte por un momento. ¿Cómo podría ser el primero verdadero?

El intérprete debería tener una "tabla de internamiento", una tabla que mapea valores de cadena a objetos de cadena, de modo que cada vez que intente crear una nueva cadena con el contenido ''abc'' , obtenga el mismo objeto. Wikipedia tiene una discusión más detallada sobre cómo funciona el interinato.

Y Python tiene una tabla de intercesión de cadenas; puede internar manualmente cadenas con el método sys.intern .

De hecho, Python puede internar automáticamente cualquier tipo inmutable, pero no es obligatorio . Diferentes implementaciones internarán diferentes valores.

CPython (la implementación que está usando si no sabe qué implementación está utilizando) autointerroga enteros pequeños y algunos singleton especiales como False , pero no cadenas (o enteros grandes, o pequeñas tuplas, o cualquier otra cosa). Puedes ver esto bastante fácilmente:

>>> a = 0 >>> a += 1 >>> b = 1 >>> a is b True >>> a = False >>> a = not a >>> b = True a is b True >>> a = 1000 >>> a += 1 >>> b = 1001 >>> a is b False

OK, pero ¿por qué z y w eran idénticos?

Ese no es el intérprete automáticamente en prácticas, ese es el compilador de valores plegables.

Si la misma cadena en tiempo de compilación aparece dos veces en el mismo módulo (lo que esto significa exactamente es difícil de definir, no es lo mismo que un literal de cadena, porque r''abc'' , ''abc'' y ''a'' ''b'' ''c'' son literales diferentes pero la misma cadena, pero fácil de entender intuitivamente), el compilador solo creará una instancia de la cadena, con dos referencias.

De hecho, el compilador puede ir aún más lejos: ''ab'' + ''c'' puede ser convertido a ''abc'' por el optimizador, en cuyo caso se puede plegar junto con una constante ''abc'' en el mismo módulo.

De nuevo, esto es algo que Python está permitido pero no se requiere que haga. Pero en este caso, CPython siempre dobla cadenas pequeñas (y también, por ejemplo, pequeñas tuplas). (Aunque el compilador de instrucción por declaración del intérprete interactivo no ejecuta la misma optimización que el compilador de módulo a la vez, por lo que no verá exactamente los mismos resultados de forma interactiva).

Entonces, ¿qué deberías hacer al respecto como programador?

Pues nada. Casi nunca tiene ninguna razón para preocuparse si dos valores inmutables son idénticos. Si quiere saber cuándo puede usar a is b lugar de a == b , está haciendo una pregunta incorrecta. Solo use a == b excepto en dos casos:

  • Para las comparaciones más legibles a los valores singleton como x is None .
  • Para valores mutables, cuando necesita saber si la mutación x afectará a y .

is y is not son los dos operadores de identidad en Python. is operador no compara los valores de las variables, pero compara las identidades de las variables. Considera esto:

>>> a = [1,2,3] >>> b = [1,2,3] >>> hex(id(a)) ''0x1079b1440'' >>> hex(id(b)) ''0x107960878'' >>> a is b False >>> a == b True >>>

El ejemplo anterior muestra que la identidad (también puede ser la dirección de la memoria en Cpython) es diferente para a y b (aunque sus valores sean los mismos). Es por eso que cuando dices a is b , devuelve falso debido a la falta de coincidencia en las identidades de ambos operandos. Sin embargo, cuando dice a == b , devuelve verdadero porque la operación == solo verifica si los dos operandos tienen el mismo valor asignado.

Ejemplo interesante (para el grado extra):

>>> del a >>> del b >>> a = 132 >>> b = 132 >>> hex(id(a)) ''0x7faa2b609738'' >>> hex(id(b)) ''0x7faa2b609738'' >>> a is b True >>> a == b True >>>

En el ejemplo anterior, aunque a y b son dos variables diferentes, a is b devuelto True . Esto se debe a que el tipo de a es int que es un objeto inmutable. Entonces, python (supongo que para ahorrar memoria) asignó el mismo objeto a b cuando se creó con el mismo valor. Entonces, en este caso, las identidades de las variables emparejadas y a is b resultó ser True .

Esto se aplicará a todos los objetos inmutables:

>>> del a >>> del b >>> a = "asd" >>> b = "asd" >>> hex(id(a)) ''0x1079b05a8'' >>> hex(id(b)) ''0x1079b05a8'' >>> a is b True >>> a == b True >>>

Espero que ayude.