Как мне сделать переменные переменные в Python?
Вот подробное руководство, например: Переменные переменные
Я слышал, что это плохая идея в целом, и это дыра в безопасности в Python. Это правда?
python
variable-variables
Тарын
источник
источник
Ответы:
Вы можете использовать словари для этого. Словари - это хранилища ключей и значений.
Вы можете использовать имена ключей переменных для достижения эффекта переменных переменных без риска для безопасности.
Для случаев, когда вы думаете о том, чтобы сделать что-то вроде
список может быть более подходящим, чем диктат. Список представляет упорядоченную последовательность объектов с целочисленными индексами:
Для упорядоченных последовательностей, списки более удобны , чем dicts с целыми ключами, так как поддержка списков итерации в индексном порядке, нарезка ,
append
, и других операциях , которые требуют управлений неудобного ключа с Dict.источник
Используйте встроенную
getattr
функцию, чтобы получить атрибут объекта по имени. Измените имя по мере необходимости.источник
Это не очень хорошая идея. Если вы обращаетесь к глобальной переменной, вы можете использовать
globals()
.Если вы хотите получить доступ к переменной в локальной области, которую вы можете использовать
locals()
, но вы не можете присвоить значения возвращенному dict.Лучшее решение - использовать
getattr
или хранить переменные в словаре, а затем обращаться к ним по имени.источник
x = "foo"
иlocals()["x"] = "bar"
используяprint x
дает выходbar
для Jython 2.5.2. Это было проверено с помощью скрипта автоматизации по требованию в Maximo .Всякий раз, когда вы хотите использовать переменные переменные, вероятно, лучше использовать словарь. Так что вместо того, чтобы писать
ты пишешь
Таким образом, вы не будете случайно перезаписывать ранее существующие переменные (что является аспектом безопасности), и у вас могут быть разные «пространства имен».
источник
Новые кодеры иногда пишут такой код:
Затем в кодере остается куча именованных переменных с усилием кодирования O ( m * n ), где m - число именованных переменных, а n - количество обращений к группе переменных (включая создание ). Более проницательный начинающий замечает, что единственная разница в каждой из этих строк - это число, которое изменяется в зависимости от правила, и решает использовать цикл. Однако они застряли на том, как динамически создавать эти имена переменных, и могут попробовать что-то вроде этого:
Вскоре они обнаруживают, что это не работает.
Если программе требуются произвольные переменные «имена», лучшим выбором будет словарь, как объяснено в других ответах. Однако, если вы просто пытаетесь создать много переменных и не возражаете обращаться к ним с помощью последовательности целых чисел, вы, вероятно, ищете a
list
. Это особенно верно, если ваши данные являются однородными, такими как суточные показания температуры, еженедельные оценки викторины или сетка графических виджетов.Это может быть собрано следующим образом:
Это
list
также может быть создано в одну строку с пониманием:Результатом в любом случае является заполнение
list
с первым элементом, к которому осуществляется доступmy_calculator.buttons[0]
, с другим сmy_calculator.buttons[1]
и так далее. «Базовое» имя переменной становится именем,list
а переменный идентификатор используется для доступа к нему.Наконец, не забывайте о других структурах данных, таких как
set
- это похоже на словарь, за исключением того, что к каждому «имени» не прикреплено значение. Если вам просто нужна «сумка» с предметами, это может быть отличным выбором. Вместо чего-то вроде этого:У вас будет это:
Используйте a
list
для последовательности похожих объектов, aset
для произвольно упорядоченного пакета объектов или adict
для пакета имен с соответствующими значениями.источник
Вместо словаря вы также можете использовать его
namedtuple
из модуля коллекций, что облегчает доступ.Например:
источник
Если вы не хотите использовать какой-либо объект, вы все равно можете использовать его
setattr()
внутри текущего модуля:источник
__dict__
переменной однако. Интересно, существует ли общий механизм для динамического создания любой глобальной переменной.globals()
может сделать этоSimpleNamespace
Класс может быть использован для создания новых атрибутов сsetattr
или подклассомSimpleNamespace
и создать свою собственную функцию для добавления новых имен атрибутов (переменные).источник
Я отвечаю на вопрос: как получить значение переменной, учитывая ее имя в строке? который закрыт как дубликат со ссылкой на этот вопрос.
Если переменные в вопросе являются частью объекта (часть класса, например) , то некоторые полезные функции для достижения точности , которые являются
hasattr
,getattr
иsetattr
.Так, например, вы можете иметь:
Тогда вы можете сделать:
источник
использование
globals()
Вы можете фактически назначать переменные глобальной области видимости динамически, например, если вы хотите, чтобы 10 переменных были доступны в глобальной области видимости
i_1
,i_2
...i_10
:Это назначит 'a' всем этим 10 переменным, конечно, вы можете также динамически изменять значение. Все эти переменные теперь доступны, как и другие глобально объявленные переменные:
источник
Вы должны использовать
globals()
встроенный метод для достижения такого поведения:источник
Согласие состоит в том, чтобы использовать словарь для этого - см. Другие ответы. Это хорошая идея для большинства случаев, однако, есть много аспектов, вытекающих из этого:
Тем не менее, я реализовал класс переменных переменных manager -class, который предоставляет некоторые из приведенных выше идей. Это работает для Python 2 и 3.
Вы бы использовали класс следующим образом:
Если вы хотите разрешить перезапись переменных только одного типа:
источник
Я пробовал оба в Python 3.7.3, вы можете использовать либо globals () или Vars ()
Ссылка:
https://www.daniweb.com/programming/software-development/threads/111526/setting-a-string-as-a-variable-name#post548936
источник
Любой набор переменных также может быть помещен в класс. «Переменные» переменные могут быть добавлены к экземпляру класса во время выполнения путем прямого доступа к встроенному словарю через атрибут __dict__.
Следующий код определяет класс Variables, который добавляет переменные (в данном случае атрибуты) к своему экземпляру во время построения. Имена переменных берутся из указанного списка (который, например, мог бы быть сгенерирован программным кодом):
источник