1

我的代码目前看起来像:

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

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

global counter
counter = 0

然后通过程序添加到计数器。问题是,当我开始在函数中添加计数器时,将全局命令放在哪里并不重要,它不会协调变量。

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

非常感谢,

4

5 回答 5

7

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

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

整数不是可变的,因此您需要global counter在任何更新计数器的函数中。如果您使用了可变对象,那么您根本不需要使用global。例如

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

def someFunction():
    counter.value += 1 

甚至制作someFunction类的方法。

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

于 2012-09-17T08:05:19.863 回答
2

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

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

无论您使用itertools.counter@Jon_Clements 之类的还是@HVNSweeting 之类的简单(模块)全局整数,在很大程度上都无关紧要。重要的是,Python 中没有可供程序员使用的真正的全局命名空间。

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

于 2014-07-03T16:08:19.050 回答
1

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

# module
globalVar = 0

def someFuncion():
    global globalVar
    globalVar += 1 # will add to global
于 2012-09-17T08:05:42.147 回答
1

你可以创建一个单独的模块,在那里初始化你的计数器,然后将它导入到你需要的地方。

myglob.py

#myglob.py
myvar = 0

主文件

#main.py
import myglob

def addvarone():
    myglob.myvar += 1

if __name__ == "__main__":
    addvarone()
    print myglob.myvar
于 2012-09-17T08:11:52.273 回答
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
于 2012-09-17T09:10:41.437 回答