2010-01-14 93 views
3

在Python中一切的工作原理是参考:的Python相当于指针

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

我想是这样的

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

你会替代神奇的指针这样Python会输出什么什么我想要。

我将不胜感激一般的解决方案(不只是为具有独立变量上面的字典例子,但东西会为其他集合和类/实例变量工作)

+1

复制? http://stackoverflow.com/questions/1145722/simulating-pointers-in-python – jbochi 2010-01-14 15:30:14

+1

我们称之为“别名”。 “a”有两个名字:'a'和'd ['a']'。这通常被认为是不好的事情,因为它不明显为什么有些变化。你为什么想这样做?创建故意隐藏的代码有什么意义? – 2010-01-14 15:58:53

+0

看到这个问题:http://stackoverflow.com/questions/1145722/simulating-pointers-in-python – 2010-01-14 15:24:35

回答

3

怎么样一个可变的数据结构?

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

的实现可能看起来像

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

    def __repr__(self): 
    return self.val 
0

这是因为1是Python中的数据类型不变,即你不能改变它的价值。

为了使它像一个指针工作,你需要一个可变的数据类型存储,你可以自己做一个类定义

class Mutable(object): 
    pass 

a = Mutable() 
a.value = 1 

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

d['a'].value在这一点上等于3。

如果你真的想,你可以重载运营商等等,让你得到相同的语义正常整数,但我建议你,而不是看看一些功能的编程模式,看看为什么不可变的类型是不错的。

2

标准的解决方案是只使用一个列表;这是最简单的可变结构。

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

不是一个优雅的解决方案,但比其他人更简单。奇怪的是,这不仅仅是我认为的语言的一部分。在这种情况下,我可以用C编写一个比在Python中更容易阅读的答案。 – Samuel 2014-12-17 17:44:27

0

如果你在一个类的工作,你可以做这样的事情:

class DRefsA(object): 
    a = 4 

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

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