经过这么多年,我仍然不喜欢Python中的globals。我的问题出现在一个uWSGI应用程序中,在init()
中,我在声明global BROWSER
后设置BROWSER = webdriver.Firefox()
,而实际上并没有设置变量。但我也在Python命令行中看到了它,希望如果我能理解为什么这个简单的示例不起作用,它也能解决我的uWSGI问题
globaltest.py
:
#!/usr/bin/python3
'''
Test of keyword `global`
'''
GLOBALTEST = None
def init():
global GLOBALTEST
GLOBALTEST = 'Something'
if __name__ == '__main__':
print('before init: GLOBALTEST', GLOBALTEST)
init()
print(' after init: GLOBALTEST', GLOBALTEST)
执行:
jcomeau@bendergift:/tmp$ ./globaltest.py
before init: GLOBALTEST None
after init: GLOBALTEST Something
jcomeau@bendergift:/tmp$ python3
Python 3.7.3 (default, Apr 3 2019, 05:39:12)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from globaltest import *
>>> GLOBALTEST
>>> init()
>>> GLOBALTEST
>>>
根据chepner的回答,我能够通过以下困难部分解决我的uwsgi问题:
但是,我在后台运行的线程仍然不能正常工作,就像我尝试将webdriver初始化移动到子例程之前一样。所以我回到了在
if __name__ == '__main__'
和else
块中初始化它需要记住的主要一点是,Python只有一个作用域是真正的全局的:内置作用域。“全局”范围实际上是一个模块全局范围,程序中的每个模块都有一个
在交互式会话中有两个名为
GLOBALTEST
的全局变量。一个是模块globaltest
的全局范围的一部分;另一个是交互式会话的全局范围的一部分,模块__main__
init
设置globaltest.GLOBALTEST
的值,因为Python使用词法作用域。您正在检查调用init
前后__main__.GLOBALTEST
的值如果您检查
globaltest.GLOBALTEST
的值,您将看到它的值发生变化:相关问题 更多 >
编程相关推荐