web-dev-qa-db-fra.com

adresse de mémoire d'impression de Python variable

Comment puis-je imprimer l'adresse mémoire d'une variable dans Python 2.7? Je sais que id () renvoie l'identificateur d'une variable ou d'un objet, mais cela ne renvoie pas le style attendu 0x3357e182 I Je m'attendais à voir 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?

63
brno792

id est la méthode que vous souhaitez utiliser: pour le convertir en hexadécimal:

hex(id(variable_here))

Par exemple:

x = 4
print hex(id(x))

M'a donné:

0x9cf10c

Qu'est-ce que tu veux, non?

(Fait amusant, lier deux variables au même int peut entraîner l'utilisation de la même adresse mémoire.)
Essayer:

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.

121
BlackVegetable

Il n’existe aucun moyen d’obtenir l’adresse mémoire d’une valeur en Python 2,7 en général. Sous Jython ou PyPy, l’implémentation ne connaît même pas l’adresse de votre valeur (et rien ne garantit que il restera au même endroit (par exemple, le ramasse-miettes est autorisé à le déplacer s'il le souhaite).

Cependant, si vous ne vous souciez que de 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 n'importe quel entier:

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

… etc.

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

8
abarnert

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

x = 5
print hex(id(x))

cela affichera l'adresse mémoire de x.

6
Jonathan