在python中获取字典以存储基元类型对象(内存位置),而不是这些对象的值?

在python中获取字典以存储基元类型对象(内存位置),而不是这些对象的值?,python,dictionary,Python,Dictionary,我想在字典中存储对象的属性,以便以后可以更改这些属性。问题是这些属性是布尔值,所以当我把它们放在字典中时,它存储的是布尔值,而不是属性变量 即 我想遍历dict并更改newnom.comp_room=True。问题是字典存储了newnom.comp_room的默认值,它是None,所以我无法设置newnom.comp_room 我可以想出很多方法来解决这个问题,比如将newnom.comp_房间设为“newnom.comp_房间”并使用exec(v+'True'),或者进入 (newno

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

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

我可以想出很多方法来解决这个问题,比如将newnom.comp_房间设为“newnom.comp_房间”并使用exec(v+'True'),或者进入

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

但我想知道是否有其他方法可以覆盖python字典中的默认行为。

这不是字典的特殊之处。作为一个整体,它是Python编程语言的固有特性。您想要通过引用传递或可变布尔值(在任何情况下,您都应该回顾一下对Python语义及其实现的理解,听起来您可能会混淆一些事情),但Python不支持这一点。你不能改变这一点,如果你能改变,你将面临好几罐的虫子

更改您的设计,以便(以模糊度递增的顺序)

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

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

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
这样做的主要缺点是代理对象占用的内存明显多于原始对象,但这可能是一个适当的折衷方案

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