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.
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 is
compare 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 is
realmente 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 id
llamada 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
Déjame decir algunas palabras