Pythonのグローバル変数とローカル変数の概要
公開: 2021-08-26Pythonは、非常に異端的な方法で変数を処理します。 多くのプログラミング言語は、デフォルトで変数をグローバルと見なしますが(ローカルとして宣言されていない限り)、Pythonは、逆に宣言されていない限り、変数をローカルと見なします。 変数をデフォルトでローカルと見なすPythonの背後にある主な理由は、グローバル変数の使用は一般に不十分なコーディング慣行と見なされているためです。
したがって、Pythonでプログラミングしているときに、関数内で変数定義が発生すると、デフォルトでローカルになります。 関数の本体内でこの変数に加えた変更または操作は、この関数のスコープ内にのみ留まります。 つまり、変数の名前が関数の変数と同じであっても、これらの変更は関数外の他の変数には反映されません。 すべての変数は、それらが定義されている関数のスコープ内に存在し、その値を保持します。 Python変数とプロジェクトを実際に体験するには、米国の最高の大学からのデータサイエンス認定を試してください。
この記事では、Pythonでのローカル変数とグローバル変数の概念と、グローバル変数の定義方法について説明します。 また、「非ローカル変数」と呼ばれるものについても見ていきます。
読む!
目次
Pythonのグローバル変数とローカル変数
Pythonの関数の本体内でグローバル値を使用する方法を理解するための例を見てみましょう。
プログラム:
def func():
print(文字列)
string =“私はPythonが大好きです!”
func()
出力
Pythonが大好きです!
ご覧のとおり、変数文字列には「Pythonが大好きです!」という値が付けられています。 func()が呼び出される前。 関数本体は、printステートメントのみで構成されています。 関数の本体内には文字列変数への割り当てがないため、代わりにグローバル変数の値を取ります。
その結果、出力は変数文字列のグローバル値(この場合は「Pythonが大好きです!」)になります。
ここで、func()内の文字列の値を変更し、それがグローバル変数にどのように影響するかを見てみましょう。
プログラム:
def func():
string =“私はJavaが大好きです!”
print(文字列)
string =“私はPythonが大好きです!”
func()
print(文字列)
出力:
私はJavaが大好きです!
Pythonが大好きです!
上記のプログラムでは、関数func()を定義し、その中に「I loveJava!」という値の変数文字列があります。 したがって、この変数は関数func()に対してローカルです。 次に、前述のようにグローバル変数を取得し、関数とprintステートメントを呼び出します。 まず、関数がトリガーされ、その関数のprintステートメントが呼び出され、「I loveJava!」という出力が配信されます。 –これはその関数のローカル変数です。 次に、プログラムが関数のスコープから外れると、sの値が「Ilove Python」に変更されます。そのため、両方の行が出力として取得されます。
ここで、最初の2つの例を追加し、printステートメントを使用して文字列にアクセスしてから、新しい値を割り当ててみましょう。 基本的に、ローカル変数とグローバル変数の両方として文字列を作成しようとしています。
幸い、Pythonはこの混乱を許容せず、エラーをスローします。 方法は次のとおりです。
プログラム:
def func():
print(文字列)
string =“私はJavaが大好きです!”
print(文字列)
string =“私はPythonが大好きです!”
func()
出力(エラー):
——————————————————————————
UnboundLocalErrorトレースバック(最後の最後の呼び出し)
<module>の<ipython-input-3-d7a23bc83c27>
5
6文字列=「Pythonが大好きです!」
-> 7 func()
func()の<ipython-input-3-d7a23bc83c27>
1 def func():
-> 2 print(string)
3文字列=「Javaが大好きです!」
4 print(string)
5
UnboundLocalError:割り当て前に参照されるローカル変数's'
明らかに、Pythonでは変数を関数内でグローバルとローカルの両方にすることはできません。 したがって、func()内の文字列に値を割り当てるため、ローカル変数が得られます。 その結果、最初のprintステートメントにエラー通知が表示されます。 関数のスコープ内で作成または変更されたすべての変数は、明示的に「グローバル」として宣言されていない限り、ローカルです。
Pythonでのグローバル変数の定義
グローバル変数にアクセスしていることをPythonに通知するには、globalキーワードが必要です。 方法は次のとおりです。
プログラム:
def func():
グローバル文字列
print(文字列)
string =「でもPythonも学びたい!」
print(文字列)
string =“ Javaを学びたいと思っています!”
func()
print(文字列)
出力:
私はJavaを学びたいと思っています!
しかし、私もPythonを学びたいです!
しかし、私もPythonを学びたいです!
出力からわかるように、Pythonはここでグローバル変数を認識し、それに応じてprintステートメントを評価して、適切な出力を提供します。
入れ子関数でのグローバル変数の使用
ここで、ネストされた関数でグローバル変数が使用された場合に何が起こるかを調べてみましょう。 変数'language'が定義され、さまざまなスコープで使用されているこの例を確認してください。
プログラム:
def func():
言語=「英語」
def func1():
グローバル言語
言語=「スペイン語」
print(“ func1:を呼び出す前に” +言語)
print( "今すぐfunc1を呼び出しています:")
func1()
print(“ func1を呼び出した後:” +言語)
func()
print(“メインの言語の値:” +言語)
出力:
func1を呼び出す前に:英語
今すぐfunc1を呼び出します:
func1を呼び出した後:英語
主な言語の価値:スペイン語
ご覧のとおり、グローバルキーワードは、ネストされたfunc1内で使用された場合、親関数の変数「言語」に影響を与えません。 つまり、値は「英語」として保持されます。 これは、func()を呼び出した後、変数「言語」が値「スペイン語」でモジュール名前空間に存在することも示しています。
この発見は、前のセクションでも理解したことと一致しています。変数は、関数の本体内で定義されている場合、特に指定されていない限り、常にローカルです。 ただし、他のさまざまなスコープに属する変数にもアクセスするためのメカニズムが必要です。
そこで、非ローカル変数が登場します。
非ローカル変数
非ローカル変数は、Python3によって導入された新しい種類の変数です。 これらはグローバル変数と多くの共通点があり、非常に重要です。 ただし、非ローカル変数とグローバル変数の違いの1つは、非ローカル変数ではモジュールスコープから変数を変更できないことです。
これを理解するには、次の例を確認してください。
プログラム:
def func():
グローバル言語
print(言語)
言語=「ドイツ語」
func()
出力:
ドイツ人
予想どおり、プログラムは「Frankfurt」を出力として返します。 ここで、「グローバル」を「非ローカル」に変更して、何が起こるかを見てみましょう。
プログラム:
def func():
非現地語
print(言語)
言語=「ドイツ語」
func()
出力:
ファイル「<ipython-input-9-97bb311dfb80>」、2行目
非現地語
^
SyntaxError:非ローカルの「言語」のバインディングが見つかりません
ご覧のとおり、上記のプログラムは構文エラーをスローします。 ここから、非ローカル割り当てはネストされた関数の定義からのみ実行できることが理解できます。 非ローカル変数は関数のスコープ内で定義する必要があります。そうでない場合は、ネストされたスコープでもその定義を見つけることができません。 次に、次のプログラムを確認してください。
プログラム:
def func():
言語=「英語」
def func1():
非現地語
言語=「ドイツ語」
print(“ func1:を呼び出す前に” +言語)
print( "今すぐfunc1を呼び出しています:")
func1()
print(“ func1を呼び出した後:” +言語)
言語=「スペイン語」
func()
print(“'言語'in main:” +言語)
出力:
func1を呼び出す前に:英語
今すぐfunc1を呼び出します:
func1を呼び出した後:ドイツ語
メインの「言語」:スペイン語
上記のプログラムは、func1()を呼び出す前に変数'language'が定義されているために機能します。 定義されていない場合、次のようなエラーが発生します。
プログラム:
def func():
#language =“英語”
def func1():
非現地語
言語=「ドイツ語」
print(“ func1:を呼び出す前に” +言語)
print( "今すぐfunc1を呼び出しています:")
func1()
print(“ func1を呼び出した後:” +言語)
言語=「スペイン語」
func()
print(“'言語'in main:” +言語)
出力:
ファイル「<ipython-input-11-5417be93b6a6>」、4行目
非現地語
^
SyntaxError:非ローカルの「言語」のバインディングが見つかりません
ただし、非ローカルをグローバルに置き換えると、プログラムは正常に機能します。
プログラム:
def func():
#language =“英語”
def func1():
グローバル言語
言語=「ドイツ語」
print(“ func1`を呼び出す前に:” +言語)
print( "今すぐfunc1を呼び出しています:")
func1()
print(“ func1を呼び出した後:” +言語)
言語=「スペイン語」
func()
print(“'言語'in main:” +言語)
出力:
func1を呼び出す前に:英語
今すぐfunc1を呼び出します:
func1を呼び出した後:ドイツ語
メインの「言語」:ドイツ語
お気づきの方もいらっしゃると思いますが、上記のプログラムではグローバル変数(言語)の値も変更されています! それが非ローカル変数がもたらす力です!
結論は
この記事では、Pythonのローカル変数、グローバル変数、および非ローカル変数について、さまざまなユースケースと注意が必要なエラーについて説明しました。 この知識があれば、さまざまな種類の変数を使って練習を始め、微妙な違いに気付くことができます。
Pythonは、世界中で非常に人気のあるプログラミング言語です。特に、データ関連の問題や課題を解決する場合はそうです。 upGradでは、85か国以上に学習者ベースがあり、世界中で40,000人以上の有給学習者がいます。また、プログラムは50万人以上の働く専門家に影響を与えています。 データサイエンスと機械学習のコースは、あらゆるバックグラウンドの意欲的な学生が旅を始め、データサイエンスの分野で優れているように設計されています。 私たちの360度のキャリア支援は、あなたが私たちに登録されると、あなたのキャリアは上向きになるだけであることを保証します。 今日私たちに連絡して、ピアラーニングとグローバルネットワーキングの力を体験してください!
スコープに基づいて、Pythonの変数はローカル、グローバル、または非ローカルのいずれかになります。 はい、Pythonの関数内からグローバル変数にアクセスできます。 グローバル変数にはプログラム全体がスコープとして含まれますが、ローカル変数にはスコープとして定義されている関数のみが含まれます。Pythonの変数の種類は何ですか?
Pythonのグローバル変数に関数内からアクセスできますか?
ローカル変数とグローバル変数の違いは何ですか?