在Python中,如何使用与对象同名的字符串来访问对象本身?

在Python中,如何使用与对象同名的字符串来访问对象本身?,python,object,reference,Python,Object,Reference,例如,在下面的代码中,我希望使用x作为参考来获得列表[1,2,3] 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' 好吧,要做你真正要求的事情,你可以使用本地人: >>> locals()[x] [1, 2, 3] 然而,这样做几乎总是一个坏主意。正如斯文·马纳奇在评论中指出的那样:。使用变量作为数据也可能存在安全风险。例如

例如,在下面的代码中,我希望使用x作为参考来获得列表[1,2,3]

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'

好吧,要做你真正要求的事情,你可以使用
本地人

>>> locals()[x]
[1, 2, 3]
然而,这样做几乎总是一个坏主意。正如斯文·马纳奇在评论中指出的那样:。使用变量作为数据也可能存在安全风险。例如,如果变量的名称来自用户,则他们可能能够读取或修改您不希望他们访问的变量。他们只需要猜测变量名

最好用字典来代替

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

你试图做的是一个坏习惯

您真正需要的是:

这是您试图实现的实际任务的正确数据结构:使用字符串访问对象

其他的答案建议(或只是用一个字表示)不同的方法。由于Python是一种非常灵活的语言,您几乎总能找到针对给定任务的不同方法,但“应该有一种——最好只有一种——显而易见的方法来完成”

他们都会做这项工作,但也不是没有缺点:

  • 可读性较低,不必要的复杂,在某些情况下也存在风险(见答案)。如果您使用
    locals()
    将实际变量与数据库变量混合使用,则会造成混乱
  • 是一种“快速而肮脏的动态获取源代码的方式”和一种新的方法
当人们对正确的选择方式产生疑问时,尝试遵循这一原则可能是一个开始


嘿,甚至可以使用字符串来访问对象,但这并不意味着我要这样做。

就像其他人指出的那样,您通常应该避免这样做,而只是使用字典(在您给出的示例中)或在某些情况下使用列表(例如,不使用
my_var1、my_var2、my_var3
->
my_vars

然而,如果你仍然想这样做,你有两个选择

你可以做:

locals()[x]

如果意大利面是一个对象属性,则可以通过以下方式安全地获取它:

getattr(your_obj, x)
用这个

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

返回
[1,2,3]

每个人都发布了很好的hacks来获得你想要的。但是每个人都警告你,做你想做的事情不是好的做法。那么你为什么要这么做呢?可能有(啊,很可能有)一个更好的方法…谢谢大家…太棒了!我已经使用了这么多年的信息,总是从谷歌搜索。这次,虽然这个问题看起来很基本,但真的找不到答案,所以决定发布我的第一个问题。几秒钟后,我已经有了一些高质量的答案。谢谢!如果答案是正确的,不要忘记接受帮助。你从来没有真正需要这样做。使用dict。就是这样!最完整的答案!谢谢!@LuisDamiani,这是一个非常糟糕的做法。它很粗糙而且不直截了当。dict正是你想要的,应该使用。是的。如果
x
不包含
'hello'
,但是
'import os;os.system(“rm-rf/”)“
,它也会执行,即使不是故意的……为什么会被否决?这确实回答了问题,不是吗。@thg435:我因为没有警告而被否决了。简单地抛出一个解决方案,而不警告一个没有经验的用户一个解决方案只是一个更好地避免的黑客(
locals()
),或者它可能有风险(
eval
),在我看来,这不是一个好答案。博格丹可以自由地利用别人留下的好评论来改进他的答案,我将取消我的否决票。
getattr(your_obj, x)
hello = [1,2,3]
print vars()['hello']