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

皆さん、こんにちは。

南波真之(なんばさねゆき)と申します。

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

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

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

今までの学習記事はこちらからご覧ください。

解きながら学ぶ Pythonつみあげトレーニングブックを読んでつまづいたところをまとめたコラム

今回は、P.172〜P.174の部分になります。

変数のスコープについて、学習してみました。

目次

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

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

変数については、以前記事にしていますのでこちらもご覧ください。

Pythonの基礎、変数を使いこなそう

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

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

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

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

噛み砕くと、変数名や関数名、クラス名など1つの名前を持つものが1つに特定できる空間のことで、名前空間が異なれば同じ名前でも別のものとしてみなされるというものです。

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

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

関数を作成
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認定スクールにもなっているため質の高い知識を得ることができ、基礎学習の先にあるそれぞれの目標を目指していくためには良い場所となります。

よく、「プログラミングは独学でもなんとかなる」という情報もありますが、新しいことを学んでいく際の近道は「プロに教えてもらうこと」です。

インターネット・アカデミーはキャリアサポートも充実しており、一人ひとりに専任のキャリアプロデューサーがサポートしてくれるため中途半端になることがありません。

ご興味ある方は各講座のページを覗いてみてください。無料カウンセリングもできます。

Pythonの基礎からDjangoフレームワークを使ったWebアプリケーションを作りたい方向けの「Python講座」

Pythonを活用したAIプログラミング、機械学習を実装したい方向けの「AIプログラミング講座」

※上記の講座は「解きながら学ぶ Pythonつみあげトレーニングブック」を基にした研修コースではありません。

良い記事だなって思ったら、是非シェアをお願いします!
  • URLをコピーしました!
  • URLをコピーしました!
目次