以编程方式在Python中创建变量

dee*_*eeb 11 python

可能重复:
如何以编程方式设置全局(模块)变量?

我有一个名为Variable的类定义如下:

class Variable():
    def __init__(self, name):
        self.name = name
        self._value = None
    def value(self):
        return self._value
    def __repr__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

我想创建26个大写的单字母变量实例,如下所示:

A = Variable('A')
B = Variable('B')
...
Z = Variable('Z')
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经尝试了各种解决方案,我提出的最好的解决方案是:

from string import uppercase
for char in uppercase:
    exec "%s = %s" % (char, Variable(str(char))) in None
Run Code Online (Sandbox Code Playgroud)

但是,这不会运行并给我这个错误:

Traceback (most recent call last):
  File "C:\Users\Administrator\Dev\python\truthtable\truthtable.py", line 7, in <module>
    exec "%s = %s" % (char, Variable(str(char))) in None
  File "<string>", line 1, in <module>
NameError: name 'A' is not defined
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

nco*_*lan 17

from string import uppercase
_g = globals()
for char in uppercase:
    _g[char] = Variable(char)
Run Code Online (Sandbox Code Playgroud)

这是否是一个主意仍然值得怀疑:)

这仅适用于globals()(即模块级别分配),因为语言定义明确指出修改返回的字典locals()可能实际上不会更改任何局部变量的值.

您还可以__dict__使用类或实例执行类似的操作.

  • Alex绝对值得一听,但是考虑到我们作为核心开发人员跳过的箍,以确保通过`globals()`修改模块状态不会破坏,他在这一点上是错误的.还有很多标准库代码使用`globals()`.在这种情况下的书面保证是一个遗漏:对于`locals()`,我们包含一个明确的说明,说修改是不可靠的(http://docs.python.org/library/functions.html#locals),但是没有关于`globals()的注释(http://docs.python.org/library/functions.html#globals) (8认同)
  • 这是不正确的 - 该警告仅适用于 locals()。语言规范保证 globals() 能够正确工作。 (2认同)

Eri*_*got 10

到目前为止,我见过的最干净的方法是直接向程序(即主模块)添加变量(即属性),如StackOverflow上的另一个问题所述:

import sys
from string import ascii_uppercase

this_module = sys.modules[__name__]
for char in ascii_uppercase:
    setattr(this_module, char, Variable(char))

print A  # Works!
Run Code Online (Sandbox Code Playgroud)

PS:Python核心开发人员努力工作以便进行修改globals()(请参阅对ncoghlan的回答的评论).因此,修改globals()是另一种选择.我不确定为什么很多人觉得它不是那么干净(可能是因为globals()可以修改的事实没有明确记录?).