Как использовать строковое значение в качестве имени переменной в Python? [Дубликат]

На этот вопрос уже есть ответ здесь:

Как мне создать переменное число переменных? 16 ответов

Предположим, у меня есть списки следующим образом:

candy = ['a','b','c']
fruit = ['d','e','f']
snack = ['g','h','i']

и строка

name = 'fruit'

Я хочу использовать строкуname для доступа к списку и его содержимому. В этом случае это должно бытьfruit, я используюname для повторения списка. Как:

for x in name:
    print x
 ayhan09 июн. 2016 г., 07:37
Вы можете сделать это с помощью eval, но я бы предложил использовать словари для хранения этих списков.
 spectras09 июн. 2016 г., 08:40
 spectras09 июн. 2016 г., 08:14
С большим акцентом: выне используйте строковое значение в качестве имени переменной в Python, Python имеет мощные инструменты и структуры данных, используйте их вместо.
 Half Genius09 июн. 2016 г., 08:26
@spectras Пожалуйста, дайте мне ссылку на структуры данных, которые я могу использовать вместо них.

Ответы на вопрос(3)

Используй словарь!

my_dictionary = { #Use {} to enclose your dictionary! dictionaries are key,value pairs. so for this dict 'fruit' is a key and ['d', 'e', 'f'] are values associated with the key 'fruit'
                   'fruit' : ['d','e','f'], #indentation within a dict doesn't matter as long as each item is separated by a , 
             'candy' : ['a','b','c']           ,
                      'snack' : ['g','h','i']
    }

print my_dictionary['fruit'] # how to access a dictionary.
for key in my_dictionary:
    print key #how to iterate through a dictionary, each iteration will give you the next key
    print my_dictionary[key] #you can access the value of each key like this, it is however suggested to do the following!

for key, value in my_dictionary.iteritems():
    print key, value #where key is the key and value is the value associated with key

print my_dictionary.keys() #list of keys for a dict
print my_dictionary.values() #list of values for a dict

словари по умолчанию не упорядочены, и это может вызвать проблемы в будущем, однако есть способы обойти это с использованием многомерных массивов или orderDicts, но мы сохраним это позже! Надеюсь, это поможет!

 TheLazyScripter09 июн. 2016 г., 08:50
@BhargavRao Но чаще всего самые простые ответы труднее всего принять!
 Bhargav Rao09 июн. 2016 г., 08:23
Иногда лучшие из ответов труднее всего использовать :-)
 TheLazyScripter10 июн. 2016 г., 11:53
Ваш ответ был отредактирован, чтобы включить диктат после того, как мой уже был опубликован. Что касается информации, я только попытался объяснить сильные и слабые стороны использования словаря.
 Sнаđошƒаӽ10 июн. 2016 г., 11:46
Что еще показывает ваш ответ, когда подход с использованием dict уже показан в существующем ответе? Кроме того, в вашем ответе есть вещи, которые не имеют отношения к делу, например orderDict, который не имеет никакого отношения к контексту.
Решение Вопроса

чего именно вы пытаетесь достичь, но это можно сделать, используяeval, Я не рекомендую использоватьeval хоть. Было бы лучше, если бы вы сказали нам, чего вы пытаетесь достичь в конце концов.

>>> candy = ['a','b','c']
>>> fruit = ['d','e','f']
>>> snack = ['g','h','i']
>>> name = 'fruit'
>>> eval(name)
['d', 'e', 'f']  

РЕДАКТИРОВАТЬ

Посмотрите на другой ответ Sнаđошƒаӽ. Это будет лучший путь.eval имеет риск для безопасности, и я не рекомендую его использовать.

Ты можешь использоватьglobals() вот так:

for e in globals()[name]:
    print(e)

Выход:

d
e
f

И если ваши переменные оказываются в какой-то локальной области видимости, вы можете использоватьlocals()

ИЛИ ЖЕ Вы можете создать свой словарь и получить доступ к этому:

d = {'candy': candy, 'fruit': fruit, 'snack': snack}
name = 'fruit'

for e in d[name]:
    print(e)
 Sнаđошƒаӽ09 июн. 2016 г., 07:52
@metatoaster Я думаю, что ваш комментарий должен быть на вопрос ОП, не так ли? ;-) Спасибо.
 metatoaster09 июн. 2016 г., 07:44
Серьезно, используйте это вместоevalособенно если передаваемое значение будет от пользователя - что позволяет пользователю эффективно запускать все, что являетсяогромный риск безопасности. Хотя используяdict будет лучше.
 spectras09 июн. 2016 г., 08:11
В самом деле. Но этот вопрос и ответы на него являются примером из учебника, который дает подробное объяснение тому, кто спрашивает, как выстрелить себе в ногу.
 Half Genius09 июн. 2016 г., 08:40
с помощьюglobals() хорошая идея
 spectras09 июн. 2016 г., 08:44
@MuhammadYaseenKhan> нет, это не так. Он предоставляет множество переменных, включая импортированные модули и внутренние переменные Python. Просто чтобы получить словарь, так почему бы не использовать словарь в первую очередь? Вот для чего они.
 Sнаđошƒаӽ09 июн. 2016 г., 10:52
@spectras Что вы подразумеваете под этим «выставляет много, много переменных, включая импортированные модули и внутренние переменные python»? Разве они уже не "разоблачены", как вы это называете,внутри globals() которыйявляется словарь кстати?
 Sнаđошƒаӽ09 июн. 2016 г., 12:52
@spectras В свой ответ я включил что-то, использующее и собственный словарь пользователя. Ваша информация кажется полезной в любом случае. Благодарю.
 spectras09 июн. 2016 г., 12:07
@ Sнаđошƒаӽ> Это моя точная точка зрения, ты не хочешь разоблачатьglobals() на случайный просмотр вне вашей программы. Здесь ключочень вероятно, исходит от внешнего источника. Использование реального словаря гарантирует, что кто-то не может передать, скажем,__sys__, math или жеsubprocess или жеPASSWORD как имя и испортить модули или собрать внутреннюю информацию.
 Sнаđошƒаӽ09 июн. 2016 г., 10:55
@MuhammadYaseenKhan Если вы так думаете, тогда пометьте его как принятый ;-)
 metatoaster09 июн. 2016 г., 14:02
@ Sнаđошƒаӽ Мне, наверное, стоит рассказать подробнее:locals() путь оконченglobals() если ОПдолжен продолжайте использовать стандартные переменные, не привязанные кdictс, но это действительно спорный вопрос, потому что единственный правильный путь - это использоватьdict, как ты говорил.

Ваш ответ на вопрос