用字符串设置python对象/变量的名称

And*_*din 3 python string function keyword argument-passing

大多数人可能会说这是一个坏主意。我想使用字符串的内容作为变量的名称。我想完成可怕的事情:

s = 'x'
x = 1
Run Code Online (Sandbox Code Playgroud)

变量名x(不知何故?)来自 string 的地方s

要回答“为什么?”,假设我有一个全局默认值x,我想要在函数中覆盖的选项。但:

x = 0
def f(**kw):
    print x
f(x=1)
Run Code Online (Sandbox Code Playgroud)

打印01。如果我可以使用 kw.keys() 中的字符串重新分配x(或任何其他全局设置的变量),那么我会很高兴。

我意识到,这适用于重新分配xf

x = 0
def f(x=x):
    print x
f(x=1)
Run Code Online (Sandbox Code Playgroud)

但是我想在我的命名空间中有许多变量的情况下这样做,我可能在某个时候想要覆盖而不重写我的模块中的每个函数定义。

Jes*_*ogt 5

检查执行

>>> 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 
Run Code Online (Sandbox Code Playgroud)

另请参阅:如何在 python 中使用 eval 分配变量的值?

经过一些实验,这似乎也有效:

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • 几乎没有理由使用 eval 或 exec。在这种情况下,您可以改用 getattr 或 setattr。 (2认同)