Как я могу использовать строку с тем же именем объекта в Python для доступа к самому объекту?

Например, в приведенном ниже коде я хотел бы получить список [1,2,3], используя x в качестве ссылки.

In[1]: pasta=[1,2,3] In:[2]: pasta Out[2]: [1, 2, 3] In [3]: x='pas'+'ta' In [4]: x Out[4]: 'pasta' 

То, что вы пытаетесь сделать, – это плохая практика.

То, что вам действительно нужно, это dict :

 >>> dct = {'pasta': [1,2,3]} >>> x = 'pas' + 'ta' >>> dct[x] [1, 2, 3] 

Это правильная структура данных для конкретной задачи, которую вы пытаетесь достичь: используя строку для доступа к объекту.

Другие ответы предложили (или просто показали с волнением) разные способы сделать это. Поскольку Python – очень гибкий язык, вы почти всегда можете найти такие разные способы для выполнения данной задачи, но «должен быть один – и желательно только один – простой способ сделать это» [1] .

Все они будут выполнять работу, но не без недостатков:

  • locals() менее читабельны, излишне сложны и также открыты для рисков в некоторых случаях (см. ответ Марк Байерс ). Если вы используете locals() вы собираетесь смешивать реальные переменные с базами данных, это грязно.
  • eval() является довольно уродливым, является «быстрым и грязным способом получить исходный код динамически» [2] и плохой практикой .

Когда вы сомневаетесь в правильном выборе, tring, чтобы следовать Zen Python, может быть началом.

И эй, даже InteractiveInterpreter может использоваться для доступа к объекту с использованием строки, но это не значит, что я собираюсь.

Как и другие, вы обычно должны избегать этого и просто использовать словарь (в примере, например, вы даете), или в некоторых случаях список (например, вместо использования my_var1, my_var2, my_var3 -> my_vars ).

Однако, если вы все еще хотите сделать это, у вас есть пара вариантов.

Вы можете:

 locals()[x] 

или

 eval(x) #always make sure you do proper validation before using eval. A very powerfull feature of python imo but very risky if used without care. 

Если паста является атрибутом объекта, вы можете получить ее безопасно:

 getattr(your_obj, x) 

Ну, чтобы сделать то, что вы буквально попросили, вы можете использовать locals :

 >>> locals()[x] [1, 2, 3] 

Однако почти всегда это плохая идея. Как заметил Свен Марнах в комментариях: Храните данные из ваших имен переменных . Использование переменных в качестве данных также может представлять угрозу безопасности. Например, если имя переменной исходит от пользователя, они могут читать или изменять переменные, к которым у вас никогда не было доступа. Им просто нужно угадать имя переменной.

Вместо этого было бы гораздо лучше использовать словарь.

 >>> your_dict = {} >>> your_dict['pasta'] = [1, 2, 3] >>> x = 'pas' + 'ta' >>> your_dict[x] [1, 2, 3] 

Использовать это

 hello = [1,2,3] print vars()['hello'] 

Возвращает [1, 2, 3] .