python memory-address

imprimir la dirección de memoria de la variable de Python



memory-address (3)

De acuerdo con id , en CPython id() es la dirección de memoria real de la variable. Si lo quiere en formato hexadecimal, llame a hex() en él.

x = 5 print hex(id(x))

esto imprimirá la dirección de memoria de x.

Esta pregunta ya tiene una respuesta aquí:

¿Cómo imprimo la dirección de memoria de una variable en Python 2.7? Sé que id () devuelve el ''id'' de una variable u objeto, pero esto no devuelve el esperado estilo 0x3357e182 que esperaba ver para una dirección de memoria. Quiero hacer algo como print &x , donde x es una variable int de C ++, por ejemplo. ¿Cómo puedo hacer esto en Python?


No hay forma de obtener la dirección de memoria de un valor en Python 2.7 en general. En Jython o PyPy, la implementación ni siquiera conoce la dirección de su valor (y ni siquiera hay garantía de que permanezca en el mismo lugar, por ejemplo, el recolector de basura puede moverlo si lo desea).

Sin embargo, si solo te preocupa CPython, id ya devuelve la dirección. Si el único problema es cómo formatear ese entero de cierta manera ... es lo mismo que formatear cualquier número entero:

>>> hex(33) 0x21 >>> ''{:#010x}''.format(33) # 32-bit 0x00000021 >>> ''{:#018x}''.format(33) # 64-bit 0x0000000000000021

… y así.

Sin embargo, casi nunca hay una buena razón para esto. Si realmente necesita la dirección de un objeto, es probable que lo pase a ctypes o similar, en cuyo caso debe usar ctypes.addressof o similar.


id es el método que quieres usar: convertirlo a hexadecimal:

hex(id(variable_here))

Por ejemplo:

x = 4 print hex(id(x))

Me dio:

0x9cf10c

Que es lo que quieres, ¿verdad?

(Dato curioso, el enlace de dos variables al mismo int puede dar como resultado que se use la misma dirección de memoria).
Tratar:

x = 4 y = 4 w = 9999 v = 9999 a = 12345678 b = 12345678 print hex(id(x)) print hex(id(y)) print hex(id(w)) print hex(id(v)) print hex(id(a)) print hex(id(b))

Esto me dio pares idénticos, incluso para los enteros grandes.