可能重复:
如何以编程方式设置全局(模块)变量?
我有一个名为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__使用类或实例执行类似的操作.
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()可以修改的事实没有明确记录?).