Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの変数のスコープを徹底解説!グローバル変数とローカル変数の違い

Pythonの変数のスコープとは

プログラム内で宣言されたすべての変数が、どこからでもアクセスできるわけではありません。変数にアクセスできるかどうかは、その変数をどこで宣言したかによって決まります。

変数の「スコープ」とは、特定の識別子(変数名)にアクセスできるプログラム上の範囲のことです。Pythonには、大きく分けて以下の2種類のスコープが存在します。

  • グローバル変数(Global variables)
  • ローカル変数(Local variables)

グローバル変数とローカル変数の違い

関数の内部で定義された変数はローカルスコープを持ち、関数の外部で定義された変数はグローバルスコープを持ちます。

つまり、ローカル変数は宣言された関数の中でのみアクセス可能である一方、グローバル変数はプログラム全体のあらゆる関数からアクセスできます。関数を呼び出すと、その内部で宣言された変数がスコープに入ります。

サンプルコード

次の例では、同じ名前の total 変数が、グローバルとローカルの両方で使われています。

#!/usr/bin/python3

total = 0  # これはグローバル変数です

# 関数の定義
def sum(arg1, arg2):
    # 引数を加算して返します
    total = arg1 + arg2  # ここでのtotalはローカル変数です
    print("関数内のローカルtotal :", total)
    return total

# sum関数を呼び出します
sum(10, 20)
print("関数外のグローバルtotal :", total)

実行結果

上記のコードを実行すると、次のような結果が出力されます。

関数内のローカルtotal : 30
関数外のグローバルtotal : 0

実行結果の解説

一見すると同じ total という名前ですが、これらはまったく別の変数として扱われます。関数内で代入された total はローカル変数であり、関数の外にあるグローバル変数の total には一切影響しません。

そのため、関数内では引数の合計値「30」が表示され、関数の外では初期値のままの「0」が表示されるのです。

globalキーワードでグローバル変数を操作する

関数の中からグローバル変数そのものを書き換えたい場合は、global キーワードを使用します。

#!/usr/bin/python3

total = 0  # グローバル変数

def sum(arg1, arg2):
    global total  # グローバル変数を使用することを宣言
    total = arg1 + arg2
    print("関数内のtotal :", total)

sum(10, 20)
print("関数外のtotal :", total)

実行結果:

関数内のtotal : 30
関数外のtotal : 30

global を宣言することで、関数内での代入がグローバル変数に対して行われるため、関数の外でも変更が反映されます。ただし、グローバル変数の乱用はコードの可読性や保守性を下げる原因になるため、必要最小限にとどめるのが良い設計とされています。

  1. Pythonの名前空間とスコープの仕組みをわかりやすく解説

    Pythonでは、変数・関数・ライブラリ・モジュールなど、さまざまな「名前」を扱います。ところが、使おうとした変数名が、すでに別の変数や関数、メソッドの名前として存在している――そんな場面に遭遇することは珍しくありません。このような名前の衝突を避けるためにも、Pythonがこれらの名前をどのように管理しているのかを理解しておく必要があります。その鍵となるのが「名前空間(namespace)」という概念です。 名前空間の3つの種類 Pythonの名前空間は、大きく次の3つに分類されます。 ローカル名前空間(Local Namespace)関数の中で定義された変数や関数の名前を保持する名前空

  2. Pythonで変数に値を代入する方法|基本構文から複数代入・スワップまで解説

    Pythonでは、変数を使うために事前に型やメモリ領域を明示的に宣言する必要はありません。変数に値を代入した時点で、宣言は自動的に行われます。値の代入には等号(=)を使用します。=演算子の左辺には変数名、右辺にはその変数に格納したい値を記述します。基本的な代入の例counter = 42 # 整数(int)の代入 speed = 60.0 # 浮動小数点数(float)の代入 name = Google # 文字列(str)の代入 print(counter) print(speed) print(name)実行結果42 60.0 Googleポイント:P