3

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

s = 'x'
x = 1

变量名x从哪里来(不知何故?)来自 string s

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

x = 0
def f(**kw):
    print x
f(x=1)

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

我意识到这适用于重新x分配f

x = 0
def f(x=x):
    print x
f(x=1)

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

4

6 回答 6

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 

另请参阅:如何在 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
于 2013-02-08T01:13:40.700 回答
1

您应该重新考虑使用global关键字(http://docs.python.org/2.7/reference/simple_stmts.html#the-global-statement

我建议也看一下Python 中“全局”关键字的使用

此外,正如 promanow 所建议的,使用全局可变对象可能是一种更好的方法。

但是,请记住,从维护的角度来看,拥有大量可能修改或依赖于变异全局的代码是非常可怕的想法。小心行事。

于 2013-02-08T01:23:15.547 回答
1

通过函数参数进行赋值并不明显,因此不被视为 Pythonic(Python 不是 C)。见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

这种效果显而易见的、可读的,因此更易于维护。

于 2013-02-08T01:27:45.653 回答
1

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

听起来你想要一堂课:

class Foo(object):
    x = 0
    def f(self):
        print self.x

my_foo = Foo()
my_foo.x = 1
my_foo.f()
于 2013-02-08T01:31:21.693 回答
0

我使用以下内容从一个全局数据库中为感兴趣的目标创建动态自定义建模数据库:

DBs = ["Target_1_DB","Target_2_DB","Target_3_DB"]

for db in DBs:
    print(db)    
    exec_str = "Modeling_DB_Base = " + db
    exec(exec_str)
    #s = "Modeling_DB_Base"
    #globals()[s] = db
    print(Modeling_DB_Base.shape)

使用注释掉的 globals() 会导致错误消息:AttributeError: 'str' object has no attribute 'shape'

于 2020-05-14T15:48:39.080 回答
-3

您可以使用以下解决方案:

s = 'x'
locals()[s] = 1
于 2020-02-10T07:38:33.383 回答