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?
答案 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的引用。 所以无论你是在改变一个参考的价值。