0

globals() を使用して文字列、整数などを代入するとうまくいきます。

 
>>> グローバル()
{'__builtins__': , '__name__': '__main__', '__doc__': なし, '__package__': なし}
>>> グローバル ()["a"] = 5
>>> あ
5
>>> グローバル()
{'__builtins__': , '__name__': '__main__', '__doc__': なし, 'a': 5, '__package__': なし}

ただし、辞書に割り当てようとすると失敗します。

>>> グローバル ()["b['c']"] = 5
>>> グローバル()
{'a': 5, "b['c']": 5, '__builtins__': , '__package__': なし, '__name__': '__main__', '__doc__': なし}
>>> b['c']
トレースバック (最新の呼び出しが最後):
  ファイル ""、1 行目、
NameError: 名前 'b' が定義されていません

これは、"b" が既に辞書として定義されている場合でも当てはまります。

では、"b['c']" などのテキスト文字列が与えられた場合、どのように b['c'] を割り当てるのでしょうか?

4

3 に答える 3

2

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

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

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

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

これによりb、値が 5 の 1 つのキーを含む新しい辞書が作成cされます。ただし、最初にグローバルを変更する必要があると考える理由については、慎重に検討してください。必要なことを行うためのより良い方法がほぼ確実にあります。

于 2012-01-21T22:59:31.860 に答える
2

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

>>> b = {}
>>> globals()["b"]["c"] = 1
>>> b
{'c': 1}
于 2012-01-21T23:06:05.310 に答える
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

于 2012-01-21T23:19:04.650 に答える