web-dev-qa-db-ja.com

Python 3でのグローバル変数の正しい使用

Python 3?のグローバル変数の正しい使い方はどれですか?:

1)global VAR_NAMEをコア関数内(関数内ではない)に1回記述し、それから他のすべての場所でVAR_NAMEとして変数を参照する

2)グローバル変数を使用するすべての関数内でglobal VAR_NAMEを1回記述し、関数の残りの部分とコアスクリプト自体で変数をVAR_NAMEとして単に参照する

39
Eden Crow

最初のケースでは、globalキーワードは無意味であるため、正しくありません。モジュールレベルで変数を定義すると、変数がグローバル変数になります。グローバルキーワードは必要ありません。

2番目の例は正しい使用法です。

ただし、グローバル変数の最も一般的な使用法は、どこでもglobalキーワードを使用しないことです。 globalキーワードは、関数/メソッドのグローバル変数reassignを使用する場合にのみ必要です。

55
Lennart Regebro

グローバル変数をローカル変数への割り当てとして解釈される方法で使用する場合は、関数でglobalキーワードを使用する必要があります。 globalキーワードなしで、関数のスコープ内でグローバルを隠すローカル変数を作成します。

以下に例を示します。

global_var = 1

def example1():
    # global keyword is not needed, local_var will be set to 1.
    local_var = global_var

def example2():
    # global keyword is needed, if you want to set global_var,
    # otherwise you will create a local variable.
    global_var = 2

def example3():
    # Without using the global keyword, this is an error.
    # It's an attempt to reference a local variable that has not been declared.
    global_var += 1
44
Dan Gerhardsson

「そうでなければローカル変数への代入として解釈されるような方法で」---はい、しかしここに微妙な詳細があります:

-------------------エラー:ローカル変数 'c​​'が割り当て前に参照されました

def work():
  c += 3

c = 0

work()
print(c)

-------------------エラー:ローカル変数 'c​​'が割り当て前に参照されました

c = 0

def work():
  c += 3

work()
print(c)

-------------------印刷[3]

def work():
  c.append(3)

c = []

work()
print(c)

-------------------印刷[3]

c = []

def work():
  c.append(3)

work()
print(c)
6
Boris T

上記の答えの最初の2つのケースと次の2つのケースの主な違いは、リストが変更可能であるという事実です。 a = 1のような場合、ポインターは1の位置を指し、a = 2と言うとポインターが移動します。

可変オブジェクトの場合、メモリロケーションが割り当てられ、appendなどのメソッドが使用されると、メモリロケーション自体が変更されるため、可変参照の値がグローバルに変更されます。

ここで大きな問題は、変更可能な変数がグローバル変数またはローカル変数であることを関数がどのように認識しているかということです。グローバル変数として)

1
Sharath