python变量范围

时间:2014-04-02 19:03:40

标签: python variables methods scope

我有一个简单的用例。我需要访问超出函数范围的变量。我的问题是,我无法看到正在反映的变化。

我有:

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 个答案:

答案 0 :(得分:3)

您需要使用global关键字将其声明为全局。 global关键字允许您在任何函数或类之外更改模块内定义的变量的值。

您始终可以在不声明全局变量的情况下打印全局变量,并且可以修改全局可变包含列表和dicts而不将其声明为全局变量,但不能分配值。下面是official documentation,下面是一个有效的例子。

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

使用全局变量有点不好。它们有自己的用例,但通常有一种更好的方法,比如将数据作为参数传递给函数或将所有函数包装在一个类中,该类保存通常为全局的值。 Globals 很好用于存储静态信息,例如配置信息,不更改的服务器地址,端口号等等。您应该尽量避免像普通变量一样使用它们。

答案 1 :(得分: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()

BAM。