2010-01-14 6 views
3

En tout python fonctionne par référence:Python équivalent de pointeurs

>>> a = 1 
>>> d = {'a':a} 
>>> d['a'] 
1 
>>> a = 2 
>>> d['a'] 
1 

Je veux quelque chose comme ça

>>> a = 1 
>>> d = {'a':magical pointer to a} 
>>> d['a'] 
1 
>>> a = 2 
>>> d['a'] 
2 

Que voulez-vous remplacer pointeur magique à un de sorte que python de sortie serait ce que Je veux.

Je vous serais reconnaissant des solutions générales (non seulement pour l'exemple ci-dessus avec le dictionnaire des variables indépendantes, mais quelque chose qui fonctionnerait pour d'autres collections et les variables de classe/instance)

+1

en double? http://stackoverflow.com/questions/1145722/simulating-pointers-in-python – jbochi

+1

Nous appelons cela un "alias". Il y a deux noms pour 'a':' a' et 'd ['a']'. C'est généralement considéré comme une mauvaise chose parce que ce n'est pas évident pourquoi quelque chose change. Pourquoi veux-tu faire cela? Quel est le point de créer un code intentionnellement obscur? –

+0

Voir cette question: http://stackoverflow.com/questions/1145722/simulating-pointers-in-python –

Répondre

3

Qu'en est-il une structure de données mutable?

>>> a = mutable_structure(1) 
>>> d = {'a':a} 
>>> d['a'] 
1 
>>> a.setValue(2) 
>>> d['a'] 
2 

Une mise en œuvre pourrait ressembler à

class mutable_structure: 
    def __init__(self, val): 
    self.val = val 

    def __repr__(self): 
    return self.val 
0

C'est parce que 1 est un type immuable en python, à savoir que vous ne pouvez pas changer la valeur de celui-ci.

Pour le faire fonctionner comme un pointeur, vous avez besoin d'un type de données mutable que le stockage, que vous pouvez vous faire avec une définition de classe

class Mutable(object): 
    pass 

a = Mutable() 
a.value = 1 

d = {'a':a} 
a.value = 3 

d['a'].value est égal à 3 à ce stade. Si vous voulez vraiment, vous pouvez surcharger les opérateurs etc. pour obtenir la même sémantique que pour les entiers normaux, mais je vous suggère plutôt de regarder quelques modèles de programmation fonctionnels pour voir pourquoi les types immuables sont agréables.

2

La solution standard consiste simplement à utiliser une liste; c'est la structure mutable la plus facile.

a = [1] 
d = {'a': a} 
a[0] = 2 
print d['a'][0] 
+0

Pas une solution gracieuse, mais mieux que les autres et simple. Bizarre ce n'est pas seulement une partie de la langue à mon avis. Je pourrais écrire une réponse plus facile à lire en C que ce que je pourrais en Python pour ce cas. – Samuel

0

Si vous travaillez dans une classe que vous pourriez faire quelque chose comme ceci:

class DRefsA(object): 
    a = 4 

    @property 
    def d(self): 
     return self.a 

    @d.setter 
    def d(self, value): 
     self.a = value