【问题标题】:How to transformation 'string' to 'variable' Python 2.7? [duplicate]如何将“字符串”转换为“变量”Python 2.7? [复制]
【发布时间】:2026-01-16 06:30:01
【问题描述】:

我需要帮助,拜托。代码更大,但我用一个例子向你展示了这个想法。 如何将“字符串联合”转换为“变量联合”

谢谢

dictionary1    = {'a':1,'b':2}
p1              = 'dictionary'
p2              = 1
union           = p1+str(p2)
vars()[union]   = union
for key,value in union.items():
    print key,value

【问题讨论】:

  • 对不起,这是代码
  • dictionary1 = {'a':1,'b':2} p1 = 'dictionary' p2 = 1 union = p1+str(p2) for key,value in union.items():打印键、值
  • 那么你想做什么? vars()[union] = union 位是无意义的(该行在这里所做的有点等同于 dictionary1 = 'dictionary1',这是毫无意义的,并且超出了全局范围,不受支持)。

标签: python string python-2.7 variables


【解决方案1】:

假设您的目标是能够访问具有动态名称的变量,则在全局、嵌套和本地范围内工作且无需大量后备代码(处理本地和全局范围名称)的唯一解决方案是使用eval:

dictionary1 = {'a':1,'b':2}
p1 = 'dictionary'
p2 = 1
union = p1+str(p2)
for key, value in eval(union).items():
    print key, value

所有eval(union) 所做的只是执行union 引用的字符串的内容,就好像它是一个Python 表达式一样;碰巧,变量的名称是一个完全合法的 Python 表达式,所以即使不是超级安全,使用eval 为您执行查找也是合法的。

如果已知变量已经在本地或全局范围内,您可以这样做:

for key, value in locals()[union].items():

for key, value in globals()[union].items():

更安全(因为它不能像eval一样执行任意代码),但不会动态检查本地、嵌套和全局范围(任何此类检查都必须手动执行,而嵌套范围会)。

请注意,一般来说,这是一个的想法。如果您需要按名称访问变量,只需将名称(作为字符串)映射到您关心的值即可。然后你就可以安全地使用这样的代码,没有eval 安全/稳定性风险:

mydicts = {'dictionary1': {'a':1,'b':2}}
p1 = 'dictionary'
p2 = 1
union = p1+str(p2)
# If union is not a string in the dictionary, this will raise KeyError,
# but can't execute arbitrary code
for key, value in mydicts[union].items():
    print key, value

【讨论】:

  • 但是 OP 正在尝试按名称(即vars()[union] = …设置变量。 eval 无法做到这一点,因为赋值不是表达式(至少在 3.8 之前不会……)。您可以使用exec 进行操作,但随后您需要为您试图避免的本地人提供所有相同的后备代码。
  • globals().setdefault(union, eval(union)) 将工作。使用eval('dictionary1') 只会返回dictionary1 指向的对象,因此在您的回答中它实际上并没有在全局范围内定义任何内容(也没有在本地范围内,但它可能已经存在)。如果此代码在循环中执行,则字典的变量名可能每次都相同,因此 OP 可以在没有 eval 的情况下执行 globals().setdefault(union, dictionary1)
  • @abarnert:你可以用eval+compile来做到这一点。 eval 只计算字符串表达式,但一个语句,包括赋值,可以在'single' 模式下使用compile 编译,然后立即传递给eval。一般来说,我倾向于使用eval+compile,因为我编写的大部分代码必须与Py2和Py3的源代码兼容,而eval+compile是唯一可靠工作的通用动态代码执行技术两者都有。
  • @ZachGates:OP 似乎要求动态加载一个变量,而不是设置它(dictionary1 已经存在,据我所知,他们只是想动态加载它),所以@ 987654349@ 就足够了。当然,vars()[union] = union 可能是对任何事情的错误尝试,但我将其解释为动态加载dictionary1 的错误尝试;如果他们想将union 设置为be dictionary1,那么union = eval('dictionary1') 就可以了。
  • @ShadowRanger eval 加上 compile 对于命名空间来说甚至比 exec 还要糟糕——即使有本地名称,它也总是会执行 STORE_NAME