我在函数内部分配全局变量名称时遇到问题。这是函数的样子:
def nodegen(slabel, dlabel, sx, xy, dx, dy, num):
for i in range(1, num + 1):
label = slabel + (i - 1)*dlabel
global vars()["n" + str(label)]
vars()["n" + str(label)] = Node(label, (sx + i*dx, sy + i*dy))
vars()["n" + str(label)].info()
实际上,功能的作用并不重要。重要的是它生成了许多对象。它们中的每一个都被赋予一个变量n1,n2,...,nnum(索引不一定具有这个序列,它取决于dlabel变量,但这并不重要)。我想让这些变量全局化,所以我可以在函数之外使用它们。问题是代码的第4行,因为似乎全局语句不适用于vars()[]语句。关于如何解决这个问题的任何想法?我收到“语法无效”错误消息。
提前致谢。
答案 0 :(得分:1)
您应该将globals()
视为字典,如下所示:
def fun(name, value):
globals()[name] = value
执行此功能后,它将添加或更新名为name
的全局变量,其值为value
,例如添加变量'a1',其值为10 fun('a1', 10)
。
vars()
与locals()
的行为相同。见http://docs.python.org/library/functions.html#vars
但请注意,添加像这样的全局变量可能是一个坏主意。您应该使它成为类的方法,并改为更新类的实例的状态。或者,您应该返回一些东西或更新传入的结构。像这样的代码的错误很难找到和诊断,因为修改变量的地方不是很明显(就像人们遵守{{的规则的情况一样) 3}}
答案 1 :(得分:1)
使用您自己的dict
,而不是滥用符号表。此外,您的函数尝试重复覆盖该变量,我认为您想要构建一个列表。
def nodegen(nodes, slabel, dlabel, sx, xy, dx, dy, num):
label = slabel + (i - 1) * dlabel
key = 'n{0}'.format(label)
nodes[key] = [
Node(label, (sx + i * dx, sy + i * dy))
for i in range(1, num + 1) # use xrange in Python 2
]
some_nodes = {}
nodegen(some_nodes, ...)
nodegen(some_nodes, ...)
不要使用全局变量,除非它们绝对不可避免,或实际上提供了显着的好处。