63

Python のグローバルステートメント ( "Python scope" )に関する質問を読んでいて、私が Python の初心者だったときにこのステートメントをどのくらいの頻度で使用したか (グローバルをよく使用していました)、そして最近では何年も経った今、どのように使用していないかを思い出していました。絶対に使わないでください。私はそれを少し「非Pythonic」とさえ考えています。

このステートメントを Python で使用しますか? 時間の経過とともに使用方法が変わりましたか?

4

12 に答える 12

58

私は次のようなコンテキストで「グローバル」を使用します。

_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
于 2008-09-28T23:23:53.210 に答える
16

私は 3 年以上 Python を専門的に使用しており、5 年以上 Python 愛好家として働いてきましたが、実稼働コードでこのステートメントを正当に使用したことはありません。変更が必要な状態はすべてクラスに存在します。または、「グローバル」状態がある場合は、グローバル キャッシュのような共有構造に存在します。

于 2008-09-28T19:39:09.303 に答える
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
于 2011-06-29T15:38:28.973 に答える
9

私の見解では、Python コードでグローバル変数を使用する必要性を感じたらすぐに、少し立ち止まってコードのリファクタリングに取り組む絶好の機会です。
コードに を入れてglobalリファクタリング プロセスを遅らせることは、期限が迫っている場合に有望に思えるかもしれませんが、本当に必要でない限り、これに戻って修正することはありません。奇妙な理由は、それをデバッグする必要があり、それらのglobal変数のいくつかに遭遇し、それらが行うことはすべて混乱させることだけです.

なので、正直、許されても極力使わないようにしています。たとえそれがあなたのコードの周りの単純なクラスビルドを意味するとしても.

于 2008-09-28T20:33:00.843 に答える
3

コマンドラインスクリプトと「optparse」を使用したグローバルオプションに使用します。

私のmain()は引数を解析し、それらをスクリプトの動作を実行する関数に渡します...しかし、提供されたオプションをグローバルな'opts'ディクショナリに書き込みます。

シェルスクリプトオプションはしばしば「葉」の振る舞いを微調整し、すべての引数リストに「opts」辞書を通すのは不便です(そして不必要です)。

于 2011-01-05T23:43:21.877 に答える
3

オブジェクトは非ローカル状態を持つための好ましい方法であるため、グローバルが必要になることはめったにありません。今後の非ローカル修飾子も広く使用されるとは思いません。ほとんどの場合、lispersが文句を言うのをやめるためにあると思います:-)

于 2008-09-28T19:46:55.757 に答える
2

めったに。私はまだそれの用途をまったく見つけていません。

于 2008-09-29T00:53:25.630 に答える
2

1回限りのタスクを自動化するために、クイック&ダーティで使い捨てのスクリプトで使用しました。それよりも大きいもの、または再利用する必要があるものはすべて、よりエレガントな方法を見つけます。

于 2008-10-10T01:28:27.507 に答える
2

私はそれを避けており、製品コードでそれを禁止するpylintルールさえあります。私は実際、それはまったく存在すべきではないと信じています。

于 2008-09-28T21:07:03.397 に答える
2

スレッドで状態を共有する場合に役立ちます (その周りのロック メカニズムを使用)。

ただし、使用することはほとんどありません。

于 2008-09-29T14:58:33.477 に答える
1

一回か二回。しかし、リファクタリングの出発点としては常に適切でした。

于 2008-09-28T19:40:27.707 に答える
0

私がそれを避けることができるなら、いいえ。そして、私の知る限り、それを回避する方法は常にあります。しかし、それがまったく役に立たないと言っているわけでもありません

于 2008-09-28T19:43:53.470 に答える