2012-04-18 10 views
0

私はPython dictを使って変数参照を格納し、それらの参照が指す値を割り当てることができます。Python dictsの変数の参照と設定

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 
+2

なぜ 'foo = 'bar''を実行できませんか?なぜあなたは辞書を使用していますか?あなたの本当の問題は何ですか? –

+2

___この___をしないでください。はい、可能ですが、間違っています。プログラムでアクセスする必要がある場合は辞書を使用し、そうでない場合は変数を使用しますが、両方を使用することはできません。 – agf

+0

私がdictを使用しているのは、変数名を表す文字列であるキーと変数自体である値を含むマップです。私は、キーにしかアクセスできない場合、execを使わないようにしたい。 –

答えて

1

あなたは、設定のdictの代替としてsetattr(profile, "mtoder_autoalpha", newvalue)を使用することができます。文字列(ブール値とタプルなど)は不変なので、あなたが期待するようには動作しません。したがって、オリジナルのオブジェクト/変数を編集するのではなく、新しい文字列を変更するときに作成します。

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を与える:あなたは本当にそれをこの方法を行うための必要性を感じた場合は、このような何かを行うことができます。

もう1つの選択肢は、__setitem__()と混乱している代替のdictサブクラスを作成して、必要な結果を得ることです。問題は、これはあなたのコードを読んでいる他の人がこのようなことを期待する方法ではないということです。このようなことに依存しないように、コードを変更する方がずっと優れています。

+0

誰も "このようにする必要性"を感じるべきではありません。また、OPがやるべきことではありません。 –

+0

@RikPoggi私は単に、OPが望むように動作しない理由を説明し、より詳細に説明します。 –

+0

* "あなたはこのようなことをすることができます" *と* "別のオプションは" *なぜ動作しないのかを説明していませんが、悪い習慣を示唆しています。 OPが必要とするのは、正しいデータ構造が彼の悪いデザインのハックではないということです。 –

2

Pythonはオブジェクトへの参照を実装しますが、変数への参照は実装しません。

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

これを、しかし、読み取り専用されているローカル機能は外のスコープからVARSを読むことしかできませんので、(私があるのはPython 3を信じて:あなたは、読み取り専用のローカル機能を使用して、ローカル変数への結合を作成することができますこれを変更するキーワードはnonlocalです)。

本当に達成したいことに応じて、最も単純な回避策は、代わりに1つの要素リストを使用することです。あなたが正常に参照することができるオブジェクト(リスト)に値をラップし、この方法:

foo = ["foo"] 
d["foo"] = foo 
d["foo"][0] = "bar" 
foo[0] # prints "bar" 
関連する問題