global宣言とnonlocal宣言は同じ関数の中で同時に行えるのか?などなど、疑問を検証してみました。nonlocal宣言を簡単に説明すると「global宣言を関数の中で行うと、関数の内側からglobal変数を変更することができる。」「nonlocal宣言を関数の中で行うと、関数の内側から、外側の関数の変数を変更することができる。実際に使う前に、「こんな使い方をしたらどうなるの?」という疑問が、たくさん浮かんできましたので、検証しました。外側の関数のどこにもnonlocal宣言された変数がない場合3.global宣言とnonlocal宣言を同時に行えるのか0.チュートリアル学習のポイントシリーズこの記事は「チュートリアル学習のポイントシリーズ」の記事です。一連の記事のリンクは、以下を参照してください。Pythonチュートリアルの学習のポイントを整理1.global宣言global宣言を関数の中で行うと、関数の内側からglobal変数を変更することができます。それでは、global宣言について検証してみましょう。global宣言の基本的な使い方まずは、基本的な使い方について検証します。コード01では、xxx1(),xxx2(),xxx3()が入れ子構造の関数になっています。1番内側のxxx3()の中で変数xについて、8行目でglobal宣言を行っています。9行目)されていますので、xxx1(),xxx2()内のxはローカル変数です。したがって、2行目で宣言したglobal変数は、関数内のxには影響を与えません。xxx3()では変数xをglobal宣言しているので、global変数を変更することができます。3に変更されています。#変更不能体の代入でも、global変数が連動して変更される。#変数xが0から3に変更されている少しだけ、難しくします。1を削除したものです。その場合、xxx2()ではコード01と同様にglobal変数の影響を受けませんが、関数xxx1()では変数xが定義されていないので、global変数の影響を受けるようになります。したがって出力02の3行目、7行目が出力01とは違う出力結果になります。0」と変数xを定義していましたが、コード03では削除しました。コード03は、本来global変数を定義すべき位置でxの値を定義していません。エラーにはならず、コード01と同様の出力ができました。関数の内側から定義することが可能です。2つの別の関数内で同じ変数のglobal宣言をおこなった場合コード03をもう一度見てみましょう。コード03では、xxx3()だけではなく、yyy2()の中でも変数xをglobal宣言しています。この場合、関数xxx3()内での変数xの変更が、yyy2()のxにも影響をあたえることがわかります。2つの別の関数内で同じ変数xのglobal宣言をおこなった場合、global宣言を行った関数同士では、変数xが連動する共通の変数になります。4」「yyy1()」を追加しました。関数yyy1()の外側(29行目)での変更が、global宣言を行った関数yyy2()のxに影響を与えていることがわかります。yyy2()内に影響を与えるのは当たり前の結果ではあります。global宣言を行った変数はどこで定義すればよいのかglobal宣言をおこなった変数は、どこで定義すればよいのでしょうか。ここでいう定義とは、実際に変数に値を代入し、変数の型などを決定することです。コード05は、18行目のxxx1()の実行前にxの値を出力しようとしましたが、xが定義されていないというエラーが発生しました。xxx1()やyyy1()の外側のglobal変数xは、xxx1()を実行することによって、8行目で、はじめて変数が定義されます。変数が定義されなければ、変数の値がきまりませんので、出力することができずにエラーになります。「変数は実際にその変数を実行するまでに、変数の定義を行う」というのが原則です。definedコード06も同様に8行目で変数xが定義される前にxを出力しようとしたのでエラーになりました。3と定義した直後(8行目)にglobal宣言を行ったのですが、「すでにxは宣言されている」というエラーになってしまいました。3としているので、global宣言する前にローカル変数として定義されてしまいました。変数xを定義する前(変数xに値を代入する前)にglobal宣言を行う必要があります。declaration2.nonlocal宣言nonlocal宣言を関数の中で行うと、関数の内側から、外側の関数の変数を変更することができます。以下、nonlocal宣言について検証します。外側の関数が複数ある場合それではnonlocalについても、まず、基本的な働きについて検証します。コード08では、xxx1(),xxx2(),xxx3()が入れ子構造の関数になっています。1番内側のxxx3()の中で変数xについて、8行目でnonlocal宣言を行っています。nonlocal宣言を関数の中で行うと、関数の内側から、外側の関数の変数を変更することができるようになりますが、xxx3()の外側には2つの関数xxx2(),xxx3()が存在します。このように外側に複数の関数がある場合には、内側から優先的に検索します。nonlocal宣言を行ったxxx3()の変数xと、そのすぐ外側のxxx2()の変数xが連動する共通の変数になります。外側の関数にnonlocal宣言された変数がない場合すぐ外側の関数にnonlocal宣言された変数がない場合には、更に外側の関数に変数がないか検索されます。=3に変更すると、すぐ、外側のxxx2()に変数xが定義されていないか検索しますが、xxx2()ではxが定義されていないので、さらに外側のxxx1()の変数xがxxx3()の変数xと連動する共通の変数になります。関数xxx2()ではxが定義されていないので、xxx2()ではその外側のxxx1()のローカル変数xの影響をうけることになります。xxx3()のxを変更すると、nonlocal宣言によって共通の変数となったxxx1()のxが変更されます。すると、xxx1()のローカル変数xの影響をうけるxxx2()においても、xの値が変わることになります。#xを定義していないので、xxx1()のローカル変数の影響をうける。#xxx3のxの変更でxxx1のxが変更。#nonlocal宣言によりXXX3のXの変更の影響を受ける。外側の関数xxx1()、xxx2()のどちらにもnonlocal宣言された変数xがない場合はどうなるのでしょうか。結果はエラーになりました。入れ子構造の関数の完全に外側、つまり、global変数に同じ名前の変数があったとしても、その値は参照しません。xxx2()では変数xが定義されていません。したがってエラーの結果となりました。2行目でglobal変数としてxが定義されていますが、nonlocal宣言では、global変数は参照できません。found3.global宣言とnonlocal宣言を同時に行えるのかglobal宣言とnonlocal宣言は同時に行うことができません。コード11ののように、7行目でnonlocal、8行目でglobal宣言を行うとエラーになりました。#nonlocalとglobalの宣言を重ねられない。以上、global宣言とnonlocal宣言の使い方について検証した結果です。スコープや、の内容が分かっていなければ、理解しにくいと思いますので、以下の記事も参考にしてください。関数のスコープは3層入れ子構造(ネスト)の具体例で理解しよう。June関連記事PythonPython♪基本:大切なものは「宝箱」に保管するテクニックプログラミングは、文法が全てではありません。基本的なテクニックを身につけることも大切です。最大値や最小値を求めるような問題では、必要なデータをif分で抽出し「宝箱」に保管しておくテクニックがあります。単純で、かつ、強力な方法ですので、例題...PythonPython♪「参照渡し後の要素の変更」と「参照渡し後の再定義」の違い関数の引数や、関数内からのグローバル変数の参照などは「参照渡し」の考え方が用いられています。この様に参照渡しは様々なところで使われているため、参照渡しが理解できていないと思わぬミスをしてしまいます。この記事では、「参照渡し」だけに注目し、...PythonPython♪リストの内包表記が苦手な人は図で感覚をつかもう慣れないとリストの内包表記って頭が変になりませんか。そんな場合は、図で感覚をつかみましょう。リストの内包表記は、for文やif文を使ったリストの作成がたった1行で書けてしまう便利な表記です。うまう使いこなせばすっきりした見やすいコ...PythonPyrhon♪関数の引数の「=」「:」「*」「**」を整理して覚えるためのポイントディフォルト値、キーワード引数、アンパック、「=」「:」「*」「**」などなど、覚えてしまえば簡単なのだと思いますが、「関数の引数に関する用語や記号はごちゃごちゃしてとっつきにくい。not)に優先順位があること。2数値や文字列の数値演算を行うこともでき、その場合演算結果がTrueやFalseにならないことです。ここでは、論理演算子の使い...Pythonpython♪基本:importで読み込むのはパッケージ?モジュール?関数?ここでは、import文の使い方を勉強します。わからないうちは、コピペするだけのつまらないimport文ですが、意味や書き方がわかれば、少しだけimport文に親しみがわいてきます。Studioが遅いときの対策2020.01.11Kotlin♪環境設定「HAXMがインストールされていません」2020.01.052020.01.08Python♪FEM:部材座標系の要素剛性マトリクス2020.01.04Kotlin♪スマホアプリの言語は、Kotlin、Java、C#、Dart?2020.01.012020.01.13スポンサーリンクスポンサーリンク。