全局变量赋值问题

时间:2011-11-08 21:44:27

标签: python

我在函数内部分配全局变量名称时遇到问题。这是函数的样子:

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()[]语句。关于如何解决这个问题的任何想法?我收到“语法无效”错误消息。

提前致谢。

2 个答案:

答案 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, ...)

不要使用全局变量,除非它们绝对不可避免,或实际上提供了显着的好处。