python变量作用域变化
我有一个简单的需求。我需要访问一些在函数外部的变量。但是我遇到的问题是,我看不到这些变量的变化。
我有:
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 = 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()
明白了吗?
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
使用全局变量有点不太好。虽然它们在某些情况下有用,但通常有更好的方法,比如把数据作为参数传递给函数,或者把所有函数放在一个类里面,这个类可以保存你通常会设为全局的值。全局变量非常适合存储静态信息,比如配置数据、不会改变的服务器地址、端口号等等。你应该尽量避免把它们当作普通变量来使用。