我需要帮助。代码更大,但我通过示例向您展示了这个想法。 如何将“字符串联合”转换为“变量联合”
谢谢
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
答案 0 :(得分:0)
假设您的目标是能够使用动态名称访问变量,那么在全局,嵌套和本地范围内工作而又没有大量后备代码(用于处理本地和全局范围内的名称)的唯一解决方案是使用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
那样执行任意代码),但不会动态检查本地,嵌套和全局范围(任何此类检查都必须手动执行并嵌套范围将是 ugly )。
请注意,通常,这是一个坏想法。如果需要按名称访问变量,只需创建一个字典即可将名称(作为字符串)映射到您关心的值。然后,您可以安全地使用这样的代码,而不会遇到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