¿Cómo funciona "is" en el caso de objetos efímeros que comparten la misma dirección de memoria?

Rick apoya a Monica

Tenga en cuenta que esta pregunta podría ser (¿es?) Específica de CPython.

Digamos que tiene una lista y verifique las copias de la lista para ver si se identifican entre sí:

>>> a=list(range(10))
>>> b,c=a[:],a[:]
>>> b is c
False
>>> id(b), id(c)
(3157888272304, 3157888272256)

No hay grandes batidos allí. Pero si hacemos esto de una manera más efímera, las cosas pueden parecer un poco raras al principio:

>>> a[:] is a[:]
False  # <- two ephemeral copies not the same object (duh)
>>> id(a[:]),id(a[:])
(3157888272544, 3157888272544)   # <- but two other ephemerals share the same id..? hmm....

... hasta que reconozcamos lo que probablemente está sucediendo aquí. No lo he confirmado mirando la implementación de CPython (apenas puedo leer c ++ por lo que sería una pérdida de tiempo, para ser honesto), pero al menos parece obvio que aunque dos objetos tienen la misma identificación, CPython es inteligente lo suficiente para saber que no son el mismo objeto.

Suponiendo que esto sea correcto, mi pregunta es: ¿qué criterios utiliza CPython para determinar si los dos objetos efímeros no son el mismo objeto, dado que tienen la misma identificación (presumiblemente por razones de eficiencia, ver más abajo)? ¿Quizás está mirando la hora en la que se marcó como basura? ¿El momento en que fue creado? O algo mas...?

Mi teoría sobre por qué tienen la misma identificación es que, probablemente, CPython sabe que ya se hizo una copia efímera de la lista y está esperando a que se recolecte la basura, y simplemente reutiliza de manera eficiente la misma ubicación de memoria. Sería genial si una respuesta pudiera aclarar / confirmar esto también.

jsbueno

Dos objetos inmutables, que comparten la misma dirección, serían, en lo que a usted respecta, indistinguibles entre sí.

El caso es que cuando lo hace, a[:] is a[:]ambos objetos no están en la misma dirección; para que el operador de identidad iscompare ambos objetos, ambos operandos deben existir, por lo que todavía hay una referencia al objeto en el lado izquierdo cuando el el código nativo para isrealmente se ejecuta.

Por otro lado, cuando lo hace, id(a[:]),id(a[:])el objeto dentro del paréntesis en la primera llamada se deja sin referencias tan pronto como se realiza la idllamada a la función, y se destruye, liberando el bloque de memoria para que lo use la segunda a[:].

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

¿Los objetos comparten la misma dirección de memoria por defecto?

¿Cómo resolver el problema de que el programa funcione de la misma manera en caso de números negativos?

¿Por qué C # usa la misma dirección de memoria en este caso?

¿Por qué C # usa la misma dirección de memoria en este caso?

Las funciones virtuales de diferentes clases comparten la misma dirección de memoria (¿no válida?)

¿Cómo fusionar varios objetos en la misma matriz que comparten la misma clave desconocida?

¿Cómo funciona la asignación de memoria en Python en este caso?

¿Cómo modificar el valor en la misma dirección de memoria eliminará el valor anterior? "Concepto SOBRESCRITO en funcionamiento en modo PC"

¿Malloc () reutiliza la misma dirección de memoria en el bucle?

Angular: mapeo Google coloca el resultado de la API en un formulario: cómo mapear dos objetos de longitud desigual pero que comparten una clave común

¿Por qué las claves y los valores de un mapa comparten la misma dirección de memoria?

¿Cómo funciona la asignación de memoria para la `lista` en Python? ¿Por qué el tamaño de la lista no es el mismo que la suma combinada de sus objetos?

¿Cómo funciona la asignación de memoria para la `lista` en Python? ¿Por qué el tamaño de la lista no es el mismo que la suma combinada de sus objetos?

¿Cómo hacer que un elemento en una matriz numpy comparta la misma dirección de memoria con otro elemento en una matriz numérica diferente?

¿Cómo hacer que un elemento en una matriz numérica comparta la misma dirección de memoria con otro elemento en una matriz numérica diferente?

Cómo manejar múltiples CollectionViews de marionetas que comparten la misma colección

¿Cómo ver el objeto en la dirección de memoria?

¿Cómo ver el objeto en la dirección de memoria?

¿Por qué el método copy () de CGImage da como resultado una imagen en la misma dirección de memoria?

C ++, ¿obtengo creo que la dirección de memoria en lugar de la cadena que quiero?

Mezcla de diferentes Enums que comparten la misma interfaz en una colección

¿Cómo mostrar el total de valores en la misma tabla como una fila (en la declaración de caso)?

Cómo funciona la copia superficial como copia profunda en el caso de los objetos inmutables en Java?

Cómo promediar los valores de las columnas que comparten la misma subcadena en los nombres de las columnas

Cómo promediar los valores de las columnas que comparten la misma subcadena en los nombres de las columnas

¿Usar switch (true) en javascript para el caso con el rango de números que no funciona?

Cómo actualizar el estado de la lista para que Rete recoja los objetos agregados en la misma para la reevaluación de las reglas

¿Cómo obtener la dirección de los objetos en el rango basado en bucles?

¿Las aplicaciones web de IIS que utilizan el mismo grupo de aplicaciones comparten archivos DLL en la memoria?