为什么类中的字典中的属性值不是指类的相同属性?

时间:2013-02-26 09:31:13

标签: python oop dictionary

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?

5 个答案:

答案 0 :(得分:2)

因为self.a在字典中分配时包含值5。整数是不可变的,因此不会引用。请阅读Python的data model

答案 1 :(得分:1)

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

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

答案 2 :(得分: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

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

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

答案 3 :(得分:0)

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

def set_a(self, new_val):
   self.a = new_val
   self.d = {'alfa': self.a}

答案 4 :(得分:0)

>>> a = 5
>>> b = {"key":a}
>>> b
{'key': 5}
>>> a = 7
>>> b
{'key': 5}
>>> 

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

所以b ['key']的值为5而不是a的引用。 所以无论你是在改变一个参考的价值。