python变量作用域变化

0 投票
2 回答
1074 浏览
提问于 2025-04-18 01:03

我有一个简单的需求。我需要访问一些在函数外部的变量。但是我遇到的问题是,我看不到这些变量的变化。

我有:

def somefunc():
    print a # None
    print b # None

def main():
    a = 'whatever'
    b = 10
    module = modules[__name__]
    getattr(module, 'somefunc')

if __name__ == 'main':
    # NOTE: if and b are changed here, then somefunc can see those changes
    a = None
    b = None
    main()

注意:由于其他一些限制,我不能把参数传递给somefunc。那么我该如何在somefunc中看到a和b的变化呢?

谢谢!

2 个回答

1

你需要使用 global 这个关键词,这样可以防止你的函数里的变量影响到外面定义的 a = Noneb = None 的范围。

def somefunc():
    print a # None
    print b # None

def main():
    global a, b
    a = 'whatever'
    b = 10
    module = modules[__name__]
    getattr(module, 'somefunc')

if __name__ == '__main__': # you need underscores around __main__ 
    a = None
    b = None
    main()

明白了吗?

3

你需要用 global 这个关键词来声明它们为全局变量。使用 global 关键词可以让你在模块内部(不管是在函数还是类里面)定义的变量的值被外部修改。

你可以随时打印全局变量,而不需要声明它们为全局变量;而且你可以修改像列表和字典这样的可变对象,而不需要声明它们为全局变量,但你不能直接给它们赋值。这里有一个 官方文档,下面是一个可以运行的例子。

a = None
b = None

def somefunc():
    # This works.
    print a # None
    print b # None

def main():
    global a, b
    a = 'whatever'
    b = 10
    # somefunc() exist in the local scope, you don't need the getattr.
    # just call it.
    somefunc()

if __name__ == '__main__': # You were missing the undescores surrounding main
    main()

演示输出:

msvalkon@Lunkwill:/tmp$ python t.py
whatever
10

使用全局变量有点不太好。虽然它们在某些情况下有用,但通常有更好的方法,比如把数据作为参数传递给函数,或者把所有函数放在一个类里面,这个类可以保存你通常会设为全局的值。全局变量非常适合存储静态信息,比如配置数据、不会改变的服务器地址、端口号等等。你应该尽量避免把它们当作普通变量来使用。

撰写回答