Python equivalente de punteros

En python todo funciona por referencia:

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

Quiero algo como esto

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

¿Qué sustituirías por un puntero mágico para que Python produzca lo que quiero?

Apreciaría soluciones generales (no solo para el ejemplo de diccionario anterior con variables independientes, sino algo que funcionaría para otras colecciones y variables de clase / instancia)

¿Qué pasa con una estructura de datos mutable?

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

Una implementación podría parecer

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

La solución estándar es simplemente usar una lista; Es la estructura más fácil de cambiar.

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

Esto se debe a que 1 es un tipo de datos inmutable en Python, es decir, no puede cambiar su valor.

Para que funcione como un puntero, necesita un tipo de datos mutable como almacenamiento, que puede hacer usted mismo con una definición de clase.

 class Mutable(object): pass a = Mutable() a.value = 1 d = {'a':a} a.value = 3 

d['a'].value es igual a 3 en este punto.

Si realmente lo desea, puede sobrecargar los operadores, etc., de modo que obtenga la misma semántica que para los enteros normales, pero le sugeriría que en cambio vea algunos patrones de progtwigción funcionales para ver por qué los tipos inmutables son agradables.

Si estás trabajando en una clase, podrías hacer algo como esto:

 class DRefsA(object): a = 4 @property def d(self): return self.a @d.setter def d(self, value): self.a = value