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キーワード (および Python の最近のバージョンでも)nonlocalは、現在のスコープのみに影響します。

于 2012-09-17T08:05:19.863 に答える
2

真のプログラムグローバルを許可するCまたはその他の言語でプログラミングしたに違いないように思えます。

残念ながら、Python にはありません。2 人の回答者が既に示唆しているように、共有名前空間にアクセスする最も簡単な方法は、共有カウンターへのアクセスが必要な他のすべてのモジュールにモジュールをインポートすることです。

@Jon_Clements のようなものを使用するか、itertools.counter@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

#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 に答える