我知道其他一些语言,如PHP,支持“变量变量名”的概念——也就是说,字符串的内容可以用作变量名的一部分。

我听说这通常是一个坏主意,但我认为它可以解决我的Python代码中的一些问题。

在Python中可以做这样的事情吗?会出什么问题?


如果您只是试图通过名称查找现有变量,请参见如何通过(字符串)名称选择变量。但是,首先考虑是否可以按照这个问题中的建议重新组织代码以避免这种需要。


当前回答

使用globals()(免责声明:这是一个糟糕的做法,但这是对您的问题最直接的回答,请使用其他数据结构作为接受的答案)。

实际上,您可以动态地将变量分配给全局作用域,例如,如果您想要在全局作用域中访问10个变量i_1, i_2…i_10:

for i in range(10):
    globals()['i_{}'.format(i)] = 'a'

这将给所有这10个变量赋值“a”,当然你也可以动态地改变这个值。所有这些变量现在都可以像其他全局声明的变量一样访问:

>>> i_5
'a'

其他回答

如果你不想使用任何对象,你仍然可以在当前模块中使用setattr():

import sys
current_module = module = sys.modules[__name__]  # i.e the "file" where your code is written
setattr(current_module, 'variable_name', 15)  # 15 is the value you assign to the var
print(variable_name)  # >>> 15, created from a string

我已经尝试了python 3.7.3,你可以使用globals()或vars()

>>> food #Error
>>> milkshake #Error
>>> food="bread"
>>> drink="milkshake"
>>> globals()[food] = "strawberry flavor"
>>> vars()[drink] = "chocolate flavor"
>>> bread
'strawberry flavor'
>>> milkshake
'chocolate flavor'
>>> globals()[drink]
'chocolate flavor'
>>> vars()[food]
'strawberry flavor'

参考: https://www.daniweb.com/programming/software-development/threads/111526/setting-a-string-as-a-variable-name#post548936

使用内置的getattr函数按名称获取对象的属性。根据需要修改名称。

obj.spam = 'eggs'
name = 'spam'
getattr(obj, name)  # returns 'eggs'

你必须使用globals()内置方法来实现这种行为:

def var_of_var(k, v):
    globals()[k] = v

print variable_name # NameError: name 'variable_name' is not defined
some_name = 'variable_name'
globals()[some_name] = 123
print(variable_name) # 123

some_name = 'variable_name2'
var_of_var(some_name, 456)
print(variable_name2) # 456

当你想使用变量变量时,最好使用字典。所以与其写

$foo = "bar"
$$foo = "baz"

你写

mydict = {}
foo = "bar"
mydict[foo] = "baz"

这样就不会意外地覆盖先前存在的变量(这是安全方面的问题),并且可以使用不同的“名称空间”。