Как использовать python globals () для обновления словарной переменной? - PullRequest
0 голосов
/ 22 января 2012

Назначение строки, целого числа и т. Д. С помощью 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']?

Ответы [ 3 ]

2 голосов
/ 22 января 2012

Словарь, возвращаемый globals, может иметь ключ для каждой глобальной переменной, но не каждый ключ в этом словаре должен соответствовать глобальной.В частности, b["c"] - это не одна глобальная переменная, а синтаксическая структура для доступа к значению, которое b ассоциируется с c.Следующее работает (но не обязательно рекомендуется):

>>> b = {}
>>> globals()["b"]["c"] = 1
>>> b
{'c': 1}
2 голосов
/ 22 января 2012

Я не могу представить, что вы пытаетесь сделать здесь.

b, кажется, уже не существует в глобалах. Вы не можете назначить словарь, который не существует.

Возможно, вы могли бы сделать это:

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

, что делает b новым словарем, содержащим один ключ, c, со значением 5. Но я бы тщательно подумал о том, почему вы думаете, что вам нужно изменить глобальные переменные в первую очередь - почти наверняка лучше способ сделать то, что вы хотите.

1 голос
/ 22 января 2012

Как бы вы присвоили словарь, содержащийся в словаре?

>>> 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'

Если вы находите это непонятным, просто разбейте его на один шаг за раз, используя более промежуточныйпеременные:

>>> 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.

...