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これを変更するキーワードがあると思います)。

本当に達成したいことに応じて、最も簡単な回避策は、代わりに 1 つの要素リストを使用することです。このようにして、通常どおり参照できるオブジェクト (リスト) に値をラップします。

foo = ["foo"]
d["foo"] = foo
d["foo"][0] = "bar"
foo[0] # prints "bar"
于 2012-04-18T08:32:06.087 に答える
1

setattr(profile, "mtoder_autoalpha", newvalue)設定dictの代わりに使用できます。文字列(およびブール値とタプル...)は不変であるため、期待どおりに機能しません。したがって、文字列を変更すると、「元の」オブジェクト/変数を編集するのではなく、作成する新しい文字列になります。

于 2012-04-18T09:42:53.420 に答える
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 に答える