223 votes

Accès à l'adresse de la mémoire de l'objet

Lorsque vous appelez le object.__repr__() en Python, vous obtenez quelque chose comme ceci :

<__main__.Test object at 0x2aba1c0cf890> 

Y a-t-il un moyen d'obtenir l'adresse de la mémoire si on surcharge __repr__() autre que d'appeler super(Class, obj).__repr__() et le regexer ?

258voto

Nick Johnson Points 79909

El Manuel Python a ceci à dire sur id() :

Retourne l'"identité" d'un objet. C'est un entier (ou un entier long) qui est garanti comme étant unique et constant pour cet objet pendant sa vie. Deux objets avec durée de vie ne se chevauchant pas peuvent même valeur id(). (Note d'implémentation : il s'agit de l'adresse de l'objet).

Donc dans CPython, ce sera l'adresse de l'objet. Il n'y a pas de garantie de ce genre pour les autres interpréteurs Python, cependant.

Notez que si vous écrivez une extension C, vous avez un accès complet aux internes de l'interpréteur Python, y compris l'accès aux adresses des objets directement.

23 votes

C'est no une réponse universelle à la question ; elle ne s'applique qu'à CPython.

9 votes

Note à soi-même : La garantie ne s'applique pas au multiprocessing

2 votes

Quelques façons de l'utiliser (pour comparer la valeur qu'il contient) : forum.freecodecamp.com/t/python-id-object/19207

87voto

Armin Ronacher Points 16894

Vous pourriez réimplémenter le repr par défaut de cette façon :

def __repr__(self):
    return '<%s.%s object at %s>' % (
        self.__class__.__module__,
        self.__class__.__name__,
        hex(id(self))
    )

4 votes

Je sais que c'est vieux, mais tu peux juste faire return object.__repr__(self) ou même simplement faire object.__repr__(obj) chaque fois que vous en avez besoin au lieu de créer une nouvelle classe

3 votes

@Artyer : Quel est le rapport entre ce commentaire et la question initiale ? La réponse postée ici consiste à recréer l'adresse comme demandé par la question initiale. Ne serait-il pas nécessaire d'utiliser des chaînes de caractères si l'on procédait comme vous le suggérez ?

2 votes

Cela me semble être la meilleure réponse. Essayez simplement de créer un objet(), de l'imprimer, puis d'imprimer hex(id(objet)) et les résultats correspondent.

64voto

Ben Hoffstein Points 44398

Il suffit d'utiliser

id(object)

18 votes

Qui donne un numéro. ... Quelle est la suite ? Je peux accéder à l'objet avec ce numéro ?

0 votes

Vous pouvez vérifier ceci id() @JLT

14voto

Peter Le Bek Points 629

Juste pour répondre à Torsten, je n'ai pas été en mesure d'appeler addressof() sur un objet python ordinaire. De plus, id(a) != addressof(a) . Ceci est en CPython, je ne connais rien d'autre.

>>> from ctypes import c_int, addressof
>>> a = 69
>>> addressof(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: invalid type
>>> b = c_int(69)
>>> addressof(b)
4300673472
>>> id(b)
4300673392

4voto

Torsten Marek Points 27554

Avec ctypes vous pouvez obtenir la même chose avec

>>> import ctypes
>>> a = (1,2,3)
>>> ctypes.addressof(a)
3077760748L

Documentation :

addressof(C instance) -> integer
Renvoie l'adresse du tampon interne de l'instance C

Notez que dans CPython, actuellement id(a) == ctypes.addressof(a) mais ctypes.addressof devrait retourner l'adresse réelle pour chaque implémentation de Python, si

  • ctypes est pris en charge
  • les pointeurs de mémoire sont une notion valide.

Modifier : ajout d'informations sur l'indépendance des ctypes vis-à-vis de l'interpréteur

14 votes

>>> import ctypes >>> a = (1,2,3) >>> ctypes.addressof(a) Traceback (dernier appel le plus récent) : Fichier "<input>", ligne 1, dans <module> TypeError : invalid type >>> id(a) 4493268872 >>>

7 votes

Je suis d'accord avec Barry : le code ci-dessus donne comme résultat TypeError: invalid type lorsque je l'essaie avec Python 3.4.

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