我正在阅读有关Python 全局语句("Python scope")的问题,我记得我在Python初学者时使用此语句的频率(我使用全球很多)以及如何,如今,多年以后,我根本不使用它。我甚至认为它有点“非pythonic”。
你在Python中使用这个语句吗?您对它的使用是否随时间而变化?
答案 0 :(得分:55)
我在这样的上下文中使用'global':
_cached_result = None
def myComputationallyExpensiveFunction():
global _cached_result
if _cached_result:
return _cached_result
# ... figure out result
_cached_result = result
return result
我使用'全局'是因为它有意义,并且对于函数的读者来说很清楚发生了什么。我也知道这种模式是等效的,但会给读者带来更多的认知负担:
def myComputationallyExpensiveFunction():
if myComputationallyExpensiveFunction.cache:
return myComputationallyExpensiveFunction.cache
# ... figure out result
myComputationallyExpensiveFunction.cache = result
return result
myComputationallyExpensiveFunction.cache = None
答案 1 :(得分:15)
在我3年多的专业使用Python以及作为Python爱好者超过5年的任何生产代码中,我从来没有合法使用该语句。我需要更改的任何状态都驻留在类中,或者,如果存在某种“全局”状态,则它位于某个共享结构中,如全局缓存。
答案 2 :(得分:10)
我在函数创建或设置将在全局使用的变量的情况下使用它。以下是一些例子:
discretes = 0
def use_discretes():
#this global statement is a message to the parser to refer
#to the globally defined identifier "discretes"
global discretes
if using_real_hardware():
discretes = 1
...
或
file1.py:
def setup():
global DISP1, DISP2, DISP3
DISP1 = grab_handle('display_1')
DISP2 = grab_handle('display_2')
DISP3 = grab_handle('display_3')
...
file2.py:
import file1
file1.setup()
#file1.DISP1 DOES NOT EXIST until after setup() is called.
file1.DISP1.resolution = 1024, 768
答案 3 :(得分:8)
在我看来,只要您觉得需要在python代码中使用全局变量,就可以暂停一下并重新编写代码。
将global
置于代码中并延迟重构过程可能听起来很有希望,如果你的死线很接近,但是,相信我,你不会回到这个并修复,除非你真的必须 - 像你的代码因某些奇怪的原因而停止工作,你必须调试它,你会遇到一些global
变量,而他们所做的只是弄乱了。
老实说,即使这是允许的,我也会尽量避免使用它。即使它意味着一个简单的类 - 围绕你的代码构建。
答案 4 :(得分:3)
对象是具有非本地状态的首选方式,因此很少需要全局。我不认为即将推出的非局部修饰符也将被广泛使用,我认为它主要是让lispers停止抱怨: - )
答案 5 :(得分:3)
我将它用于命令行脚本和'optparse'的全局选项:
我的main()解析参数并将这些参数传递给脚本工作的任何函数......但是将提供的选项写入全局'opts'字典。
Shell脚本选项通常会调整'leaf'行为,并且通过每个参数列表对'opts'字典进行线程化是不方便的(也是不必要的)。
答案 6 :(得分:2)
我避免使用它,我们甚至在我们的生产代码中禁止使用pylint规则。我实际上相信它根本不存在。
答案 7 :(得分:2)
很少。我还没有找到它的用途。
答案 8 :(得分:2)
它可以在线程中用于共享状态(具有围绕它的锁定机制)。
但是,我很少使用它。
答案 9 :(得分:2)
我在快速和快速使用它脏的,一次性脚本,以自动执行一些一次性任务。任何比这更大的东西,或者需要重复使用的东西,我会找到一种更优雅的方式。
答案 10 :(得分:1)
一次或两次。但重构始终是一个很好的起点。
答案 11 :(得分:0)
如果我可以避免它,不。而且,据我所知,总有一种方法可以避免它。但我并没有说明它完全无用