在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
我想创建 26 个大写字母的 Variable 实例,像这样:
A = Variable('A')
B = Variable('B')
...
Z = Variable('Z')
到目前为止,我尝试了各种方法,最好的结果是:
from string import uppercase
for char in uppercase:
exec "%s = %s" % (char, Variable(str(char))) in None
但是,这个代码无法运行,并且给我报了这个错误:
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
我哪里做错了?
6 个回答
4
嗯,这个方法看起来不太好,但你可以直接访问 globals()
这个字典:
for c in 'ABC':
globals()[c] = Variable(c)
11
我见过的最简单的方法就是直接在你的程序(也就是主模块)中添加变量(也就是属性),就像在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!
PS: Python的核心开发者们为了让修改globals()
变得可能,付出了很多努力(可以看看对ncoghlan回答的评论)。所以,修改globals()
也是一种选择。不过,我不太明白为什么很多人觉得这样做不够干净(也许是因为globals()
可以被修改的这个事实没有被明确记录下来?)。
28
from string import uppercase
_g = globals()
for char in uppercase:
_g[char] = Variable(char)
这是否是个好主意还有待商榷 :)
这个方法只适用于globals()
(也就是模块级别的赋值),因为语言的定义明确指出,修改locals()
返回的字典可能并不会真正改变任何局部变量的值。
你也可以对一个类或实例的__dict__
做类似的操作。