2017-08-02 4 views
1

alist += [4] et alist = alist + [4] sont différents car le premier change la référence de alist alors que ce dernier ne le fait pas. J'ai essayé ceci ci-dessous sur IDLE en utilisant id() et il semble que c'est une affirmation correcte.Obtenir l'adresse mémoire en Python, identifier s'il s'agit d'une liste ou d'un dictionnaire et mettre à jour son contenu

code exécuté sur IDLE (Python 3.6.1)

>>> alist = [1, 2, 3] 
>>> id(alist) 
50683952 
>>> alist += [4] 
>>> id(alist) 
50683952 
>>> alist = alist + [4] 
>>> id(alist) 
50533080 

Voici la documentation pour id(): https://docs.python.org/3/library/functions.html#id

Est-il possible d'obtenir référence à l'adresse mémoire programatically, déterminer si l'emplacement a une liste ou un dictionnaire, lire le contenu et mettre à jour le contenu en utilisant la référence?

NOTE: J'ai trouvé 2 messages pertinents de stackoverflow mais je ne suis pas sûr qu'ils répondent à ma question.

+1

Ce que 'id' renvoie ne sont pas des emplacements de mémoire. Vous ne pouvez pas accéder à ceux avec python. En fait, vous ne pouvez y accéder dans aucune langue (même C, tout ce que vous obtenez sont les adresses logiques). –

+0

ah ok, mais la documentation dit que id() est l'adresse de l'objet en mémoire. – JRG

+1

Un abus de langage, certainement. C'est seulement un entier donnant une indication de la référence de l'objet, qui ressemble vaguement à une référence de mémoire. –

Répondre

1

Vous essayez de faire quelque chose comme en C, avec un opérateur Déréférencer, tels que *, vous pouvez en lire davantage dans this question. Je suis sûr que Python n'a aucun support pour faire ce que vous essayez d'accomplir, vous devez changer votre paradigme d'esprit, penser différemment pour obtenir les résultats que vous voulez.

Comme vous le lisez, vous pouvez « obtenir l'adresse mémoire » d'un objet, mais vous voulez jamais trouver un moyen (au moins en python 2 - 3) pour obtenir le chemin du retour

0

Si vous devez vérifier si un objet Python est un dict ou une liste, utilisez isinstance. Si vous avez besoin de vérifier si l'identifiant unique d'un objet (lié à l'adresse mémoire, je crois), utilisez id. Si vous devez vérifier l'égalité par valeur, utilisez ==.

Il n'y a aucune raison de faire ce que vous faites en ce moment: tout dans Python est un pointeur compilé par référence, garbage-collecté, vous ne devriez pas vous inquiéter de la façon dont cela est mis en œuvre. En plus d'être enclin à décomposer la version en version, il n'est pas intentionnellement exporté dans l'API Python.

Si vous avez besoin de l'adresse d'un PyObject dans l'API C, eh bien c'est déjà un pointeur (et déjà fait pour vous). Vous pouvez utiliser l'API C pour vérifier si un pointeur connu pour être un PyObject est dict ou list en conséquence.