2012-01-21 10 views
0

グローバルにように、文字列、整数の割り当て、および()が正常に動作します:Pythonのglobals()を使って辞書変数を更新するにはどうすればよいですか?

 
>>> globals() 
{'__builtins__': , '__name__': '__main__', '__doc__': None, '__package__': None} 
>>> globals()["a"] = 5 
>>> a 
5 
>>> globals() 
{'__builtins__': , '__name__': '__main__', '__doc__': None, 'a': 5, '__package__': None} 

しかし、辞書に代入しようとすると失敗します。

 
>>> globals()["b['c']"] = 5 
>>> globals() 
{'a': 5, "b['c']": 5, '__builtins__': , '__package__': None, '__name__': '__main__', '__doc__': None} 
>>> b['c'] 
Traceback (most recent call last): 
    File "", line 1, in 
NameError: name 'b' is not defined 

これはあっても真である「B」既に辞書として定義されています。

"b ['c']"などのテキスト文字列を指定すると、b ['c']をどのように割り当てるのですか?

+0

'globals()[" [[c '] "] = 5'?これは何をするはずですか? 'b ['c']'という名前の変数はありません。なぜこれを変数名として使用しようとしていますか? –

+1

あなたは何をしようとしているのか分かりませんが、間違った経路を辿ることはほぼ確実です。 –

答えて

2

私はあなたがここで何をしようとしているのか想像できません。

bはすでにグローバルに存在していないようです。存在しない辞書に割り当てることはできません。

おそらく、あなたはこれを行うことができます:

b新しい辞書は5の値で、1つのキー、 cを含むしかし、私はあなたが変更する必要があると思う理由について慎重に検討したいなり
globals()["b"] = {'c': 5} 

第一に世界全体に広がっています - あなたが望むことをやるためのより良い方法がほとんどあります。

+0

私が言ったように、たとえbがglobals()に辞書として存在していても問題は同じです。言いましたが、あなたの答えは正しいです:変数名の文字列表現としてglobals()の辞書の値を代入するのではなく、個々の部分として代入します。 –

+0

globals()["xx"]を使用すると、変数名を文字列として処理しています - したがって、あなたの例では、アクセスしようとしている変数は "b ['c'] ' b、魔女から索引['c']を検索する@Daniel Roseman、これを正しく行う方法を与えたにもかかわらず、これも同様に理解していないようでした。 – jsbueno

2

globalsによって返された辞書には、すべてのグローバル変数のキーが含まれていますが、その辞書のすべてのキーがグローバルに対応する必要はありません。具体的には、b["c"]は単一のグローバル変数ではなく、bcに関連付けられている値にアクセスするための構文構造です。以下は機能します(必ずしも推奨されるわけではありません):

>>> b = {} 
>>> globals()["b"]["c"] = 1 
>>> b 
{'c': 1} 
1

辞書に含まれる辞書にどのように割り当てますか?

>>> outer = {'inner': { 'foo': 'bar' }} 
>>> print outer['inner']['foo'] 
bar 

>>> outer['inner']['foo'] = 'baz' 
>>> print outer['inner']['foo'] 
baz 

globals()だけグローバル変数が格納されている辞書を返します。変数名はキーです。したがって、他の辞書と同じ方法でそれにアクセスします(その内部のネストされた構造)。

>>> globals()['outer']['spoon'] = 'fork' 
>>> print outer['spoon'] 
'fork' 

あなたはこの混乱を見つけた場合は、単により多くの中間変数を使用して、一度に1つのステップにそれを破る:

>>> g = globals()   # fetch the globals() dictionary into g 
>>> o = g['outer']  # fetch the outer dictionary from g into o 
>>> o['spoon'] = 'fork' # store 'fork' under the key 'spoon' in o 

は、同じことがあなたの未遂で「小さなステップに壊す」ことをやるようにしてください構文、あなたはあなたが得ることがわかります:ここで

>>> g = globals()   # fetch the globals() dictionary into g 
>>> g["b['c']"] = 5  # store 5 under the key "b['c']" in g 

あなたがキー"b['c']"で辞書にして値を挿入しました。辞書とは全く関係ないので、何の誤りもありません。しかし、それは変数にマッピングされたまったくナンセンスです。

あなたが行ったことは、名前がb['c']の変数の作成に相当します。 bという名前の変数ではなく、キーが'c'の辞書を指しています。 globals()を経由せずにこの変数を実際に参照する方法はありません。有効なPython識別子ではないからです。あなたが書き出すことを試みるたびに、Pythonは変数bの中にあるキーを参照していると解釈します。

関連する問題