1. ホーム
  2. パイソン

[解決済み】Pythonの "global "キーワードの使用について

2022-03-28 08:52:42

質問

ドキュメントを読んで理解したのは、Pythonは関数用に別の名前空間を持っていて、その関数でグローバル変数を使いたい場合は global .

私はPython 2.7を使用しており、次のような小さなテストを試してみました。

>>> sub = ['0', '0', '0', '0']
>>> def getJoin():
...     return '.'.join(sub)
...
>>> getJoin()
'0.0.0.0'

がなくても問題なく動作しているようです。 global . グローバル変数に問題なくアクセスできました。

何か見落としがあるのでしょうか?また、以下はPythonのドキュメントからです。

<ブロッククオート

グローバルステートメントに記載された名前 として定義されてはならない。 パラメータ、またはforループ制御 ターゲット、クラス定義、関数 の定義、またはimportステートメントを使用します。

形式パラメータやクラス定義は理解できるのですが、forループ制御対象や関数定義の制約が理解できないのです。

どうすればいいですか?

キーワード global は、ローカルコンテキストでグローバル変数を変更または作成する場合にのみ有効です。ただし、グローバル変数を作成することが良い解決策と見なされることはほとんどありません。

def bob():
    me = "locally defined"    # Defined only in local context
    print(me)

bob()
print(me)     # Asking for a global variable

上記で得られます。

locally defined
Traceback (most recent call last):
  File "file.py", line 9, in <module>
    print(me)
NameError: name 'me' is not defined

を使用する一方で global ステートメントを使用すると、その変数は関数のスコープの外側で使用できるようになり、事実上グローバル変数になります。

def bob():
    global me
    me = "locally defined"   # Defined locally but declared as global
    print(me)

bob()
print(me)     # Asking for a global variable

というわけで、上記のコードで得られるのは

locally defined
locally defined

さらに、pythonの性質上、以下のように global を使用して、関数、クラス、その他のオブジェクトをローカルコンテキストで宣言します。しかし、何か問題が発生したときやデバッグが必要なときに悪夢を見ることになるので、やめたほうがいいと思います。