Pythonにおける変数のスコープ

2022/12/2
執筆者:南波真之

※本記事は吉政創成株式会社「Python学習とキャリアアップ」より寄稿されたコラムとなります。

Pythonにおける変数のスコープ

私は現在、Pythonについて勉強を進めています。というのも、AIやデータ分析、アプリケーション開発など様々な状況でPythonは活用されており、テクノロジー業界で活躍していくためには必要だと思っているからです。

と言っても、私はエンジニアではない文系の人間です。

解きながら学ぶ Pythonつみあげトレーニングブック」を使って、Pythonの一番基本的なところを学んでいます。そこで、自分で学習してきて感じたポイントや疑問、皆さんにシェアできることを書いていきます。

今回は、P.172〜P.174の部分になります。変数のスコープについて、学習してみました。

Pythonの変数と変数のスコープとは

変数というのは、「値(数値、文字列)を入れておいて、後で取り出せる入れ物」のことを言います。英語だとVariableといい、変数の名前もある程度自分でわかりやすいようにつけることができます。

今回は、その変数のスコープについてです。プログラム中で作成した変数には使用できる範囲があるようなのでそこを把握しておく必要があります。

スコープを学ぶためには、まず「名前空間(namespace)」を理解することが必要となります。

名前空間とは、Pythonのドキュメントによると、このように書いてあります。

名前空間 (namespace) とは、名前からオブジェクトへの対応付け (mapping) です。

いくつか例を見てみます。

まず関数の場合、関数の中で作成した変数はその関数の中だけでしか使えません。これはイメージがつきやすいと思います。関数というのは、一連の処理をひとまとまりにしたもののことを言います。そのため、その関数の中で定義された変数はその関数内でしか使えないというのは納得できます。

関数を作成
def support_animal():
# 関数内で、変数を定義
animal = 'ドラゴン'
support_animal()
作成した関数の外で関数内で定義した変数を使ってみる
print(animal)

シンプルな関数を作成し、その中で変数 animal を定義しました。その後、関数の外で関数内で定義した変数 animal を出力してみます。

その結果はどうなると思いますか。

正解は、以下のようになります。

---------------------------------------------------------------------------
NameError                Traceback (most recent call last)
/var/folders/sr/rgb5j5g16n9_509d0nr0qq9r0000gn/T/ipykernel_54986/142578767.py in <module>
    3
    4 support_animal()
----> 5 print(animal)

NameError: name 'animal' is not defined

エラーが出ました。NameErrorで、 animal というのが定義されていないというメッセージになっています。

先程作成した関数内では animal を定義していましたが、関数の外では animal は定義されていません。名前空間がよくわかりますね。

関数中の名前空間は、ローカルな名前空間ということから、その中の変数をローカル変数と呼びます。ローカルのため、利用できる範囲が限られているということです。

ここで疑問に思うのですが、ローカルがあるのであればグローバルもあるのではないか。

この疑問は正しくて、グローバルな名前空間のグローバル変数も存在します。

# 関数を作成
def support_animal():
    # 関数内で、変数を定義
    animal = 'ドラゴン'

support_animal()
# グローバル変数を作成
animal = 'ペガサス'
# 作成した関数の外で関数内で定義した変数を使ってみる
print(animal)

↓(出力)

ペガサス

グローバル変数として関数の外に animal = 'ペガサス'を作成しました。すると、最後の行の print(animal)で表示されるのは、ペガサスとなります。

ここまでをまとめると、以下のようになります。関数内で定義した変数(ローカル変数)は関数内でしか使えないため、def support_animal() 内の変数利用であれば問題なくできます。しかし、関数の外になるとローカル変数は使うことができないため、グローバル変数の方を使用できるということになります。

# 関数を作成
def support_animal():
    # 関数内で、変数を定義
    animal = 'ドラゴン'
    print(animal)

support_animal()
# グローバル変数を作成
animal = 'ペガサス'
# 作成した関数の外で関数内で定義した変数を使ってみる
print(animal)

↓(出力)

ドラゴン
ペガサス

また、関数内のようなローカルな範囲でもグローバル変数を作成することも実は可能で、利用ケースはあまり多くないようですが、 global というキーワードを使用します。

def support_animal():
    # 変数 animal がグローバル変数であることを宣言
    global animal
    animal = 'ドラゴン'

support_animal()
print(animal)

↓(出力)

ドラゴン

Pythonのドキュメントもぜひ参照してみてください。

この名前空間なのですが、一見面倒くさい機能のように見えます。しかし、大きなベネフィットがあるため使用されています。それは、プログラムが長く複雑になってきたときに発生します。グローバル変数を使っていくと1つの変数を変更した場合などに影響力が計り知れない危険性があります。数十行くらいまでのプログラムであれば把握ができるかもしれませんが、それより長いプログラムになるととても大変ですし、値が変わることによる不具合なども出る可能性が高いです。

そのため、ローカル変数にして利用する、関数内ではグローバル変数の更新を極力行わない、複数関数にまたがっての値のやり取りには引数を活用するなどの工夫をする必要があります。

変数のスコープ理解は非常に大事

今回は、Pythonの変数のスコープについて学習してきました。そのためには名前空間という概念の理解と、どこまでの影響範囲になるかというところで、ローカル変数とグローバル変数の理解を行いました。

ここは比較的理解はしやすいかなと思いつつ、様々なコードを見たり、書いたりする際には最初は特に立ち止まって確認しながら行う必要があると思います。手を動かしながらぜひ理解してPython学習を進めていきましょう。

インターネット・アカデミーは、Python講座が充実しています。Python認定スクールにもなっているため質の高い知識を得ることができ、基礎学習の先にあるそれぞれの目標を目指していくためには良い場所となります。ご興味ある方は各講座のページを覗いてみてください。

Pythonが学べる講座

この記事の執筆者

南波真之

デジタル人材育成・助成金のお役立ち資料をダウンロード

デジタル人材育成や助成金活用のお役立ち資料などをまとめてダウンロードしていただけます。コンサルタントへの無料相談をご希望の方はこちらからお問い合わせください。

たとえばこんな相談ができます
  • DX人材の育成&事例紹介 リスキリングのロードマップ付き
  • デジタル人材育成に使える助成金制度
  • デジタルスキル標準 役割別おすすめ講座
資料ダウンロードはこちら
会社名必須
部署名必須
お名前必須
電話番号必須
メールアドレス必須

個人情報の利用目的についてご同意いただいた場合のみ、「同意して進む」を押してください。

このページの上へ