Я знаю, что некоторые другие языки, такие как PHP, поддерживают концепцию "имен переменных переменных", то есть содержимое строки может использоваться как часть имени переменной.
Я слышал, что это плохая идея в целом, но я думаю, что это решило бы некоторые проблемы, которые есть у меня в коде Python.
Возможно ли сделать что-то подобное в Python? Что может пойти не так?
Если вы просто пытаетесь найти существующую переменную по ее имени, см. Как я могу выбрать переменную по имени (string)?. Однако сначала подумайте, можете ли вы реорганизовать код, чтобы избежать этой необходимости, следуя советам, приведенным в этом вопросе.
Переведено автоматически
Ответ 1
Для этого можно использовать словари. Словари представляют собой хранилища ключей и значений.
Вы можете использовать имена ключей переменных для достижения эффекта переменных переменных без риска для безопасности.
>>> x = "spam" >>> z = {x: "eggs"} >>> z["spam"] 'eggs'
Для случаев, когда вы думаете сделать что-то вроде
var1 = 'foo' var2 = 'bar' var3 = 'baz' ...
список может быть более подходящим, чем dict . Список представляет собой упорядоченную последовательность объектов с целочисленными индексами:
lst = ['foo', 'bar', 'baz'] print(lst[1]) # prints bar, because indices start at 0 lst.append('potatoes') # lst is now ['foo', 'bar', 'baz', 'potatoes']
Для упорядоченных последовательностей списки удобнее, чем dicts с целочисленными ключами, потому что списки поддерживают итерацию в порядке индекса, нарезку, append и другие операции, которые потребовали бы неудобного управления ключами с помощью dict.
Ответ 2
Используйте встроенную getattr функцию, чтобы получить атрибут объекта по имени. Измените имя по мере необходимости.
Это не очень хорошая идея. Если вы обращаетесь к глобальной переменной, вы можете использовать globals().
>>> a = 10 >>> globals()['a'] 10
Если вы хотите получить доступ к переменной в локальной области видимости, вы можете использовать locals(), но вы не можете присваивать значения возвращаемому dict .
Лучшим решением является использование getattr или сохранение ваших переменных в словаре, а затем доступ к ним по имени.
Ответ 4
Начинающие программисты иногда пишут подобный код:
Затем программист остается с кучей именованных переменных, затрачивая на кодирование O(m * n), где m - количество именованных переменных, а n - количество обращений к этой группе переменных (включая создание). Более проницательный новичок замечает, что единственное различие в каждой из этих строк - это число, которое изменяется в зависимости от правила, и решает использовать цикл. Однако они зацикливаются на том, как динамически создавать имена этих переменных, и могут попробовать что-то вроде этого:
for i inrange(10): my_calculator.('button_%d' % i) = tkinter.Button(root, text=i)
Вскоре они обнаруживают, что это не работает.
Если программе требуются произвольные "имена" переменных, лучшим выбором будет словарь, как объясняется в других ответах. Однако, если вы просто пытаетесь создать множество переменных и не возражаете ссылаться на них с помощью последовательности целых чисел, вы, вероятно, ищете list. Это особенно актуально, если ваши данные однородны, такие как ежедневные показания температуры, результаты еженедельных викторин или сетка графических виджетов.
Это можно собрать следующим образом:
my_calculator.buttons = [] for i inrange(10): my_calculator.buttons.append(tkinter.Button(root, text=i))
Это list также может быть создано в одной строке с пониманием:
my_calculator.buttons = [tkinter.Button(root, text=i) for i inrange(10)]
Результатом в любом случае будет заполненный файл list, при этом доступ к первому элементу осуществляется с помощью my_calculator.buttons[0], к следующему с помощью my_calculator.buttons[1] и так далее. "Базовое" имя переменной становится именем list, а для доступа к ней используется изменяемый идентификатор.
Наконец, не забывайте о других структурах данных, таких как set - это похоже на словарь, за исключением того, что к каждому "имени" не привязано значение. Если вам просто нужен "пакет" объектов, это может быть отличным выбором. Вместо чего-то подобного:
keyword_1 = 'apple' keyword_2 = 'banana'
if query == keyword_1 or query == keyword_2: print('Match.')
У вас будет это:
keywords = {'apple', 'banana'} if query in keywords: print('Match.')
Используйте a list для последовательности похожих объектов, a set для произвольно упорядоченного набора объектов или a dict для набора имен со связанными значениями.