让所有变量可在命名空间中访问

3 投票
4 回答
1187 浏览
提问于 2025-04-15 21:26

假设我有一个简单的函数:

def myfunc():
    a = 4.2
    b = 5.5
    ... many similar variables ...

我只用这个函数一次,我在想有没有什么简单的方法可以让函数里面的所有变量在我的主命名空间中都能访问到。

我需要为每个变量都声明为全局变量吗?或者有没有其他推荐的方法?

谢谢。

4 个回答

1

我想不出有什么好理由去这么做,但如果你真的出于某种奇怪的原因想这么做:

def myfunc():
    x = 5.6
    y = 7.3
    # many other variables
    globals().update( locals() )

这个方法之所以有效,是因为 globals 函数会返回一个字典,里面包含了你模块中所有的全局变量。你可以用 locals 函数返回的所有局部变量字典来动态更新这些全局变量。

这非常危险,因为这样会覆盖你全局命名空间中的所有内容。如果你已经有了一个 xy 变量,它们就会被新的值替换掉。正如我所说,我真的想不出有什么好理由去这么做,所以在使用这种技巧之前一定要三思而后行!

5

如果你想把常量分开管理,可以把它们放在另一个模块里:

consts.py

foo = 42
bar = 'quux'

main.py

import consts

print consts.foo
print consts.bar[::-1]
8

我个人觉得最好的方法是把字典包装成一个好看的对象,这样你就可以像访问属性一样访问“变量”。我在很多年前给这个模式起了个名字叫Bunch,而且它也是Python哲学中最后一条的一个很好的例子(如果你不知道那是什么,可以在交互式命令行输入import this来查看)。简单来说就是……:

class Bunch(object):
    def __init__(self, d=None):
        if d is not None: self.__dict__.update(d)

def myfunc():
    a = 4.2
    b = 5.5
    ...
    return Bunch(locals())

x = myfunc()

print x.a, x.b

这里的关键点是使用合格名称,比如x.ax.b,而不是裸名称,像ab。合格名称可以让你分开不同的命名空间,处理起来更合适,而裸名称就会把所有东西混在一起,违背了Python的哲学;-)。当然,你也不需要使用没有包装的字典和难看的x['a'], x['b']访问方式!-)

撰写回答