¿Cómo asignar una dirección de memoria a una variable en Python?

Aquí está el escenario:

Me olvido tontamente de asignar el objeto devuelto a una variable:

>>> open("random_file.txt")  

¿Hay una manera de asignar directamente la dirección de memoria a una variable? Algo más o menos equivalente a

 int *ptr; *ptr = 0x158f780; 

Puntos de contraataque:

  1. En este caso, simplemente puedo descartar el objeto: el archivo se abre en modo de lectura y el objeto será recogido por el GC. Pero estoy interesado en una solución para el escenario en el que necesito liberar el recurso de una manera determinista.

  2. Supongo que la parte “en 0x158f780” es simplemente el id () del objeto, que es la dirección de memoria en CPython (“esto es específico de la implementación y puede cambiar, blah-blah”). Por lo tanto, me interesan los dos escenarios: vincular una variable al valor id () sería genial (más portátil y qué no), pero vincularla a una dirección de memoria simple también estaría bien

  3. Busqué en google un poco para cualquier cosa relacionada con “puntero de Python”, asignación de dirección de variable / memoria y similar, pero parece que mi google-fu no es lo suficientemente fuerte.

Aclamaciones,

EDITAR:

Algunas tangentes después de leer las respuestas y explorar los documentos de Python: el objeto REPL hace referencia al objeto del archivo _ var. Tan pronto como _ se asigna al resultado del siguiente comando, asumo que su refcount va a 0. El objeto de archivo se elimina de la memoria, y si asumimos que implementa un método __del__ sano, debería encargarse de todos los Detalles de nivel, es decir, cerrar el archivo y así sucesivamente. http://docs.python.org/reference/datamodel.html#object.__del__ detalla el escenario general.

Eso y agregaré 0.0.0.0 stackoverflow.com a / etc / hosts …

Python es un lenguaje de alto nivel. No puede (no directamente) meterse con las direcciones de memoria, por lo que la respuesta es no.

Sin embargo, el REPL almacena convenientemente el resultado de la última expresión en una variable mágica _ . Puedes conseguirlo desde allí. Para citar tu ejemplo.

 >>> open("/etc/passwd","r") #Oops I forgot to assign it  >>> f = _ # Not to worry. It's stored as _ >>> f  >>> 

No puede, por la misma razón que no puede asignar y liberar memoria por sí mismo y no puede lanzar (como en “vamos a reinterpretar este trozo de memoria como si tuviera este aspecto”): tratar con la memoria en este nivel es Se considera que es propenso a errores, no importante y automatizable para ser incluido en el idioma. Alégrate de que así sea, probablemente ya habrías vivido algunos choques y bichos sutiles causados ​​por tontos que a pesar de que serían inteligentes y abusarían de algo en este sentido.

Como otros estados tienen estados, el último objeto impreso se almacena en _ por REPL, por lo que puede usarlo si sucede durante una sesión interactiva y lo captura muy pronto.

(Tenga en cuenta que, estrictamente hablando, podría escribir una extensión CPython que proporcione una función para tomar un int de Python, tomar un valor bruto sin caja y convertirlo en un PyObject * . Es horrible y poco práctico).