0
class test(object): 
    def __init__(self): 
        self.a = 5 
        self.d = {'alfa': self.a}

我实例化该类的一个对象,并为其分配一个新值:

a_test = test()
a_test.a = 7

为什么a_test.d['alfa']保持 5 而不是变为 7?

4

5 回答 5

2

因为self.a包含5在字典中分配它时的值。整数是不可变的,因此不进行引用。请阅读 Python 的数据模型

于 2013-02-26T09:34:36.753 回答
1

在调用构造函数时创建字典。因此字典中的值是在构造过程中设置的——它们不是通过引用传递,而是通过值传递。

字典中的值指向传入的对象的值,而不是对象本身。所以简单地self.a作为一个值不会自动更新字典,除非self.a是可变的(例如一个列表)。

于 2013-02-26T09:35:55.007 回答
1

让我提议我的DictObj课程,我一直在使用它来解决以下问题:

class DictObj(dict):
    """
    a dictionary like class that allows attribute-like access to its keys

    d = DictObj(a=2, b=7)
    d['a']  --> 2
    d.a     --> 2

    """
    def __getattr__(self, name):
        return self.__getitem__(name)


    def __setattr__(self, name, value):
        if name in self:
            self.__setitem__(name, value)
        else:
            super(DictObj, self).__setattr__(name, value)


    def __add__(self, other):
        res = DictObj(self)
        res.update(other)
        return res

项目存储在字典中,但也可以作为对象的属性访问。

您可以使用更多魔术方法轻松扩展它以满足您的需求。

于 2013-02-26T10:57:41.477 回答
0
>>> a = 5
>>> b = {"key":a}
>>> b
{'key': 5}
>>> a = 7
>>> b
{'key': 5}
>>> 

你可以在这里看到,在“a”的分配实例值传递给字典“b”,它是 5。

所以 b['key'] 的值为 5 而不是 a 的引用。因此,无论您是否更改参考值时的值。

于 2013-02-26T11:11:14.850 回答
0

您应该添加一个 setter 来管理您的类实例:

def set_a(self, new_val):
   self.a = new_val
   self.d = {'alfa': self.a}
于 2013-02-26T09:38:52.940 回答