Obtenir un pointeur vers un élément de la liste
Je me demandais si il était possible d'obtenir un "pointeur" vers un élément dans une liste python. De cette façon, je serais en mesure d'accéder à mon élément directement sans avoir besoin de connaître mon index d'un élément. Ce que je veux dire par là c'est que dans une liste, vous pouvez ajouter des éléments n'importe où; au début, au milieu ou même à la fin, pourtant, les différents éléments ne sont pas déplacés de leur emplacement de mémoire réelle. En théorie, il devrait être possible de faire quelque chose comme:
myList = [1]
[1]
element = &myList[0]
élément pourrait agir comme un pointeur ici.
myList.insert(0, 0)
myList.append(2)
[0, 1, 2]
À ce point, je voudrais encore être en mesure d'accéder à l'élément directement, même si c'est de l'indice dans la liste a changé.
La raison pour laquelle je veux faire, c'est parce que dans mon programme, il serait trop fastidieux de garder une trace de chaque article que j'ai ajouter à ma liste. Chaque élément est généré par un objet. Une fois dans un certain temps, l'objet est de mettre à jour la valeur, mais il ne peut pas être garanti qu'il va trouver son élément au même indice que lorsqu'il a été ajouté. Avoir un pointeur permettrait de résoudre le problème. J'espère qu'un sens.
Quelle serait la bonne façon de faire quelque chose comme ça en Python?
pointer = id(myList[0])
Mais vous ne pouvez pas faire grand chose avec ça 🙂- C'était rapide! Cela m'a conduit à trouver le code suivant: stackoverflow.com/questions/1396668/python-get-object-by-id
- Suggestions de lecture: Améliorer Considérablement Votre Python: Comprendre Python Modèle d'Exécution
- Merci! J'ai eu l'intention de lire quelque chose comme ça pendant un certain temps.
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de notion de pointeurs sur python (au moins que je suis au courant).
Dans le cas où vous êtes enregistrement des objets à l'intérieur de votre liste, vous pouvez simplement conserver une référence à cet objet.
Dans le cas où vous enregistrez des valeurs primitives dans votre liste, l'approche que je voudrais faire est de faire un objet wrapper autour de la valeur ou des valeurs et de conserver une référence de l'objet pour l'utiliser plus tard sans avoir à accéder à la liste. De cette façon, votre wrapper est un objet mutable et peuvent être modifiés à n'importe d'où vous avez accès aux elle.
Un exemple:
obj
les références à laFooWrapper(5)
même après que quelque chose a été inséré en face d'elle dans la liste.element = mylist[0]
fonctionne déjà si vous n'avez pas besoin de changer l'élément ou sielement
est un objet mutable.Des objets immuables comme
int
objets en Python que vous ne pouvez pas changer. En outre, vous pouvez vous référer au même objet à l'aide de plusieurs noms en Python par exemple,sys.getrefcount(1)
est de ~2000 dans une nouvelle REPL sur mon système. Naturellement, vous ne voulez pas1
à dire2
tout d'un coup, dans tous ces endroits.Si vous souhaitez modifier un objet plus tard, alors qu'il devrait être mutables par exemple, si
mylist[0] == [1]
, puis changer la valeur, vous pouvez définirelement[0] = 2
. Un objet personnalisé à la place de la[1]
liste pourrait être plus approprié pour une application spécifique.Comme alternative, vous pouvez utiliser un dictionnaire (ou autre espace de noms des objets tels que des
types.SimpleNamespace
) au lieu de lamylist
liste. Alors pour changer l'élément de référence par son nom:mydict["a"] = 2
.