在Python中程序化创建变量

15 投票
6 回答
19713 浏览
提问于 2025-04-16 10:59

可能重复的问题:
如何通过编程设置全局(模块)变量?

我有一个叫做 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__做类似的操作。

撰写回答