2012-01-10 3 views
7

Возможно ли создать локальные переменные с кодом Python, учитывая только имя переменной (строку), чтобы последующие вызовы «xxx» в locals() «вернули True?Возможно ли «динамически» создавать локальные переменные в Python?

Вот визуальный:

>>> 'iWantAVariableWithThisName' in locals() 
False 
>>> junkVar = 'iWantAVariableWithThisName' 
>>> (...some magical code...) 
>>> 'iWantAVariableWithThisName' in locals() 
True 

Для какой цели я требую этого обмана другая тема полностью ...

Спасибо за помощь.

+0

Он предостерегал против, но это может быть сделано в Python 2.x, используя EXEC функцию - но не в 3.0: http://stackoverflow.com/questions/1450275/modifying-locals-in-python – philofinfinitejest

+3

«С какой целью я требую, чтобы этот обман стал еще одной темой ...» - и это бесконечно более важно **. Задайте вопрос, который относится к тому, что вы действительно хотите сделать, а не вопрос, который относится к тому, как вы думаете, что хотите сделать это. –

+0

Karl: MitchellSalad отмечает в комментарии ниже, что вместо этого он использует словарь - хороший выбор. –

ответ

9

Если вы действительно хотите сделать это, вы могли бы использовать exec:

print 'iWantAVariableWithThisName' in locals() 
junkVar = 'iWantAVariableWithThisName' 
exec(junkVar + " = 1") 
print 'iWantAVariableWithThisName' in locals() 

Конечно, кто-нибудь скажет вам, насколько опасно и хаком с помощью Exec есть, но так будет любая реализация этого «обман».

+1

Хех. Мы даже использовали очень похожие предложения - вплоть до использования курсива! - указать, что ОП, вероятно, не должно этого делать. Я думаю, что на самом деле должен быть один очевидный способ (объясните, почему вы не должны этого делать). – DSM

+0

Да, но ваш устанавливает junkVar в None, а мой устанавливает его в 1. Это имеет значение. :) +1 к твоему –

+0

Это будет работать только в Python 2, так как отключает оптимизацию локальных сетей. * Ваша функция будет работать медленнее *, когда вы это сделаете. Это не будет работать вообще в Python 3. –

6

Вы можете играть в игры и обновлять локальные() вручную, что иногда будет работать, но вы не должны. Это специально предупреждено в документах. Если бы я был , чтобы сделать это, я бы, вероятно, использовать Exec:

>>> 'iWantAVariableWithThisName' in locals() 
False 
>>> junkVar = 'iWantAVariableWithThisName' 
>>> exec(junkVar + '= None') 
>>> 'iWantAVariableWithThisName' in locals() 
True 
>>> print iWantAVariableWithThisName 
None 

Но девяносто три раза из ста вы действительно хотите использовать словарь вместо.

+0

Спасибо за ответ. Для этого конкретного экземпляра вызов exec выглядит намного более вкусным, чем управление словарем, из-за огромного количества имен переменных, которые производит мой код. Можете ли вы, возможно, подробнее рассказать о том, что вы подразумеваете под действием «иногда» exec? EDIT: Словарь будет работать нормально. Не нужно разрабатывать. :) – MitchellSalad

+0

Что «иногда» работает, это обновление словаря locals, а не использование exec. Например: 'locals() [" myvar "] = 1'. В [docs] (http://docs.python.org/library/functions.html#locals) говорится: «Примечание: содержимое этого словаря не должно изменяться, изменения могут не влиять на значения используемых локальных и свободных переменных переводчиком ». –

+1

@MitchellSalad: нет, я имел в виду, что обновление locals() - то есть locals() ['junkVar'] = 99 - это немного опасно, и анти-рекомендуется .. exec должен работать, несмотря на проблемы безопасности. Я не уверен, что я разделяю ваши вкусы, хотя: * больше * переменных, которые у меня были, тем более вероятно, что я буду их вставлять в словарь. – DSM

-1

Не нужно использовать exec, но locals() [string], или vars() или globals() также работают.

test1="Inited" 

if not "test1" in locals(): locals()["test1"] = "Changed" 
if not "test1" in locals(): locals()["test2"] = "Changed" 

print " test1= ",test1,"\n test2=",test2 
+1

Попробуйте это в функции, и это не сработает. – pyrospade

Смежные вопросы