在python中获取字典来存储基本类型对象(内存位置)而不是那些对象的值?

时间:2011-11-02 19:41:44

标签: python dictionary

我想在字典中存储对象的属性,以便稍后更改这些属性。问题是这些属性是布尔值,所以当我把它们放在字典中时,它会存储布尔值,而不是属性变量。

    location_dict = {
    'dorm_common':newnom.dorm_common,
    'cafeteria':newnom.cafeteria,
    'comp_room':newnom.comp_room}

我想遍历dict并更改newnom.comp_room = True。问题是字典存储了newnom.comp_room的默认值,即None,所以我无法设置newnom.comp_room。

我可以想办法解决这个问题,例如制作newnom.comp_room“newnom.comp_room”并使用exec(v +'True'),或者进入

    (newnom.__dict__()[k] = True)

但我想知道是否有另一种方法可以在python字典中覆盖这个默认行为。

2 个答案:

答案 0 :(得分:2)

这对词典来说并不特别。它是整个Python编程语言的固有特性。你想要传递引用或可变布尔(并且无论如何你应该检查你对Python的语义及其实现的理解,你听起来可能会让一些东西混淆),但是Python不支持这一点。而且你无法改变它,如果可以的话,你将面临几种可能的蠕虫病毒。

改变你的设计(按照不断增加的顺序)......

  • 您只存储对象,并通过其他方式访问/更改各种属性(例如使用getattr / setattr,或使用专门的方法进行验证以限制动态蠕变和事故 - 甚至可能newnom)。我真的推荐这个。这是迄今为止最简单,最不令人惊讶的方法。
  • 您可以从dict值转到对象并直接更改属性(例如,存储(对象,属性名称)元组:(newnom, 'dorm_common'))。
  • location_dict实际上不是一个字典,而是支持某些字典操作的对象,并将它们路由到newnom的操作。 (如果你有大量需要外部字典的遗留代码,我只会推荐这样的hackery。)

答案 1 :(得分:0)

您可以尝试使用包含要修改的值的代理对象:

class MutableProxy(object):
    __slots__ = "value"
    def __init__(self, value):
        self.value = value

    def get(self):
        return self.value

    def set(self, value):
        self.value = value

然后,您可以使用get()set()函数设置实际值,例如:

>>> var_1 = MutableProxy(100)
>>> var_1.get()
100
>>> d = { "var_1" : var_1 }
>>> d["var_1"].set(600)
>>> var_1.get()
600

这样做的主要缺点是代理对象将占用比原始对象更多的内存,但这可能是一个适当的权衡。