Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。spam"となる理由がわかりません。spam"となるか、初心者でもわかるように、超簡単にご説明いただけないでしょうか。票5そのプログラムでは合計3つのspam変数が登場しますが、区別できるようにコメントをつけるとこうなります。spam3do_localは当然ローカル変数spamを宣言して代入しているだけなので、scope_testで宣言された変数spam(spam2)には影響しません。spamにより、グローバルスコープを除く外側のスコープに存在する一番階層が近い変数spam(この場合spam2)を使いますよ、と宣言することになります。spam"になります。spamによりグローバルスコープの変数spamを使いますよ、と宣言します。spam"を実行した時点で、グローバル変数spam(spam3)が作られます。spam"が出力されるということになります。個の銅バッジ「変数名変えたらそうなるのは当たり前では」と思われるだけで説明になってないのではないでしょうか。理屈がわかってる人にであればこれで意図も伝わるかもしれませんが。スコープの説明は面倒だったので、どのspamがどのspamと対応しているのかを示せば理解の助けになるというつもりでした。ご指摘頂いたとおり分かりにくかったので、説明を追加していきます。spam)これがscope_test()関数のスコープ内で実行されているのでglobalではなくnonlocalなspamを出力します。spam"と出力されるでしょう。spam)がグローバルスコープで実行されるわけではないということです。値の更新と評価に関係がないわけです。実際この文はnonlocalなスコープで呼び出されていますね。|1do_localは問題の核心ではないので省いて説明します。spam上のコードは、このコードと等価です。spamglobal宣言は、グローバルスコープ=トップレベルで変数を定義したということを意味します。nonlocal宣言すらパスすると、こうなります。・ネストされた関数内で宣言することが必要。(ここではdo_nonlocal配下)・宣言前にスコープ外であらかじめ変数を定義しておくことが必要。(scope_test配下)・global宣言を受けた変数ではない。nonlocal宣言を書けば,その変数は、ネスト関数配下のローカル変数とは扱われなくなります。spam"一番の疑問で、do_nonlocal()を呼び出した後で、do_global()を呼び出しているのに、なぜ、spamは、上書きされないのでしょうか?このspamは、結果2と同じ定め方をされているので、do_global()では、上書きできないのだと考えます。|0簡単に言えば、関数内にグローバルと同名の変数がある場合のみそれぞれの変数は別の変数に変身します。ノンローカルが優先されているのではなくグローバルがその変数に関与していないだけです。spam)を消して実行してみてください。意味がわかると思います。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。