140 votes

affiche l'adresse mémoire de la variable Python

Comment imprimer l'adresse mémoire d'une variable en Python 2.7 ? Je sais que id() renvoie l'identifiant d'une variable ou d'un objet, mais il ne renvoie pas le style 0x3357e182 auquel je m'attendais pour une adresse mémoire. Je veux faire quelque chose comme print &x où x est une variable int C++, par exemple. Comment puis-je faire cela en Python ?

246voto

BlackVegetable Points 2887

id est la méthode que vous voulez utiliser : pour le convertir en hexagone :

hex(id(variable_here))

Par exemple :

x = 4
print hex(id(x))

Il m'a donné :

0x9cf10c

C'est ce que vous voulez, non ?

(En fait, le fait de lier deux variables à la même int peut entraîner l'utilisation de la même adresse mémoire).
Essayez :

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))

Cela m'a donné des paires identiques, même pour les grands nombres entiers.

17voto

Jonathan Points 496

Selon le manuel en CPython id() est l'adresse mémoire réelle de la variable. Si vous la voulez au format hexadécimal, appelez hex() sur elle.

x = 5
print hex(id(x))

ceci imprimera l'adresse mémoire de x.

15voto

abarnert Points 94246

Il n'existe aucun moyen d'obtenir l'adresse mémoire d'une valeur dans Python 2.7 en général. En Jython ou PyPy, l'implémentation ne connaît même pas l'adresse de votre valeur (et il n'y a même pas de garantie qu'elle restera au même endroit - par exemple, le ramasseur de déchets peut la déplacer s'il le souhaite).

Toutefois, si vous ne vous intéressez qu'à CPython, id renvoie déjà l'adresse. Si le seul problème est de savoir comment formater cet entier d'une certaine manière c'est la même chose que de formater cualquier entier :

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

et ainsi de suite.

Cependant, il n'y a presque jamais de bonne raison pour cela. Si vous avez réellement besoin de l'adresse d'un objet, il est vraisemblable de la passer à ctypes ou similaire, auquel cas vous devez utiliser ctypes.addressof ou similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X