Python纠正全局使用

时间:2012-09-17 08:03:43

标签: python global

我的代码目前看起来像:

import modules
class
functions
main code block (if __name__ == "__main__":)

在整个程序中我想添加一个计数器。 我的想法是添加

global counter
counter = 0

然后通过程序添加到计数器。问题是,当我开始在函数中添加计数器并不重新调整变量时,放置全局命令的位置并不重要。

放置全局命令的正确位置在哪里(即程序启动等)以及实现此目的的正确方法(是使用全局命令还是通过使用类?

非常感谢,

5 个答案:

答案 0 :(得分:7)

您需要将全局命令放在每个需要重新绑定全局变量的函数中。

您不需要将其放在仅读取全局的函数中,或者将值变为但不重新绑定它的函数。你不需要把它放在函数之外。

整数不可变,因此在更新计数器的任何函数中都需要global counter。如果您使用了可变对象,则根本不需要使用global。 e.g。

class Counter:
    def __init__(self):
       self.value = 0
counter = Counter()

def someFunction():
    counter.value += 1 

甚至让someFunction成为该类的方法。

global关键字(以及最新版本的Python上的nonlocal)仅影响当前范围。

答案 1 :(得分:1)

您需要将变量的每次访问声明为使用它的全局,而不是整个程序。基本上是这样的:

# module
globalVar = 0

def someFuncion():
    global globalVar
    globalVar += 1 # will add to global

答案 2 :(得分:1)

您可以创建一个单独的模块,在那里初始化您的计数器,然后将其导入到您需要的位置。

myglob.py

#myglob.py
myvar = 0

main.py

#main.py
import myglob

def addvarone():
    myglob.myvar += 1

if __name__ == "__main__":
    addvarone()
    print myglob.myvar

答案 3 :(得分:1)

在我看来,你必须使用C语言或其他允许真正的程序全局变量的语言进行编程。

不幸的是,Python没有。正如两位回答者已经建议的那样,访问共享命名空间的最简单方法是将模块导入需要访问共享计数器的每个其他模块。

你是否使用像@Jon_Clements这样的itertools.counter或像@HVNSweeting这样的简单(模块)全局整数,这在很大程度上是无关紧要的。重要的是,Python中的程序员没有真正的全局命名空间。

甚至不考虑修改内置插件!

答案 4 :(得分:0)

我会选择一个单独的模块(可能称为计数器)并输入类似的内容:

from itertools import count

_counter = count(1) # assuming += 1

def get(): # or a more suitable name?
    return next(_counter)

# possibly add a 'peek' function?

然后在需要的其他模块中使用它......

import counter
import others...

def x(a, b, c):
    curcout = counter.get()
    # ...
pass