在Python dicts中引用和设置变量

时间:2012-04-18 08:16:07

标签: python dictionary reference

我想使用python dict存储变量引用,并能够分配这些引用指出的值。

foo = "foo"
d = {'foo' : foo}
d['foo'] = "bar"
foo
// output: 'foo', but I want it to be 'bar'.

我该如何做到这一点?

编辑: 一些实际的代码。

settings = values["settings"] // This is a dict, such as {"metoder_alphasort" : "on"}
field_map = {"metoder_alphasort" : profile.metoder_alphasort}
for setting in field_map.keys():
    if settings.has_key(setting):
        if settings[setting] == 'on':
            field_map[setting] = True
# field_map[setting] is now True, but profile.metoder_alphasort is False

3 个答案:

答案 0 :(得分:2)

Python实现对对象的引用,但它没有实现对变量的引用。您可以使用本地函数创建对局部变量的只读绑定:

foo = "foo"
def readfoo(newval):
     return foo
d["foo"] = readfoo
foo = "bar"
d["foo"]() # returns "bar"
foo = "baz"
d["foo"]() # returns "baz"

然而,这是只读的,因为本地函数只能从外部范围读取变量(我相信Python 3中有nonlocal关键字可以改变这一点。)

根据您真正想要实现的目标,最简单的解决方法是使用一个元素列表。这样,您可以将值包装在可以正常引用的对象(列表)中:

foo = ["foo"]
d["foo"] = foo
d["foo"][0] = "bar"
foo[0] # prints "bar"

答案 1 :(得分:1)

你的想法不会起作用,因为字符串是不可变的 - 值不会改变,而是被替换。如果你真的觉得有必要这样做,你可以做这样的事情:

class MutableString:
    def __init__(self, string):
        self.string = string

    def __str__(self):
        return self.string

    def __repr__(self):
        return "MutableString("+repr(self.string)+")"

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

foo = MutableString("foo")
d = {'foo' : foo}
d['foo'].set("bar")
print(foo)

这使我们bar作为输出。

另一种选择是创建一个替代的dict子类,它与__setitem__()混淆,产生你想要的结果。问题是,这不是其他人阅读你的代码会期望这些东西工作的方式。你改变代码要好得多,所以它不依赖于这类东西。

答案 2 :(得分:1)

您可以使用setattr(profile, "mtoder_autoalpha", newvalue)替代设置字典。你这样做的方式不会像你期望的那样工作,因为字符串(以及布尔和元组......)是不可变的,所以当你改变它时,你创建一个新字符串,而不是编辑'原始'对象/变量。 / p>