0

我想使用 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
4

3 回答 3

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"
于 2012-04-18T08:32:06.087 回答
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__()来产生你想要的结果。问题是,这不是其他阅读您的代码的人会期望这些东西起作用的方式。你最好改变你的代码,所以它不依赖于这种事情。

于 2012-04-18T08:27:18.493 回答
1

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

于 2012-04-18T09:42:53.420 回答