大多数人可能会说这是个坏主意。我想将字符串的内容用作变量的名称。我想完成可怕的事情:
s = 'x'
x = 1
变量名x
来自(以某种方式?)来自字符串s
。
要回答“为什么?”,请说我有一个x
的全局默认值,我希望在函数中覆盖该选项。但是:
x = 0
def f(**kw):
print x
f(x=1)
打印0
而不是1
。如果我可以使用kw.keys()中的字符串来重新分配x
(或任何其他全局设置的变量),那么我会很高兴。
我意识到这可以在x
中重新分配f
:
x = 0
def f(x=x):
print x
f(x=1)
但是对于我的命名空间中有许多变量,在某些时候可能要重写而不重写模块中的每个函数定义的情况,我想这样做。
签出exec
>>> print x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> s = 'x'
>>> exec(s + " = 1")
>>> print x
1
另请参见:How can I assign the value of a variable using eval in python?
经过一些试验,这似乎也可行:
>>> print x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> s = 'x'
>>> globals()[s] = 1
>>> print x
1
您应重新考虑使用global
关键字(http://docs.python.org/2.7/reference/simple_stmts.html#the-global-statement)
我也建议您同时查看Use of "global" keyword in Python。
而且,正如promanow所建议的那样,使用全局可变对象可能是一种更好的方法。
但是,请记住,从维护的角度来看,拥有大量[[might修改或依赖于全局变量的代码是非常可怕的想法。小心踩。
import this
。我完成平面配置的廉价方法是通过全局局部指令:
In [1]: from functools import partial
In [2]: config = partial(dict)
In [3]: def f(x=None):
...: print x or config.x
...:
In [4]: config.x = 'foo'
In [5]: f()
foo
达到此效果的目的是]显而易见,易读,因此更易于维护。
但是对于我的命名空间中有许多变量,在某些时候可能要重写而不重写模块中的每个函数定义的情况,我想这样做。