我有一个简单的用例。我需要访问超出函数范围的变量。我的问题是,我无法看到正在反映的变化。
我有:
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的更改?
谢谢!
答案 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 = None
和b = 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。