質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

451閲覧

ローカル/グローバルスコープが理解できません、サルでもわかるくらいのご説明お願いいたします:(

Kyohei

総合スコア23

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/09/28 03:37

環境:Mac OS,Python3系
初歩的ですがスコープが何なのか?参考書には「変数の格納庫」と書かれていますがしっくり来ず。。。
プログラムが実行されるとスコープが消滅し、その変数は忘れられるなどチンプンカンプンです。
下記のプログラムのRUN後の表示が以下のようになるのもよく分からず。。。
ざっくりした質問で申し訳ありませんがご教授お願いいたします。

def spam(): eggs = 'spam lacal' print(eggs) def bacon(): eggs = 'bacon local' print(eggs) spam() print(eggs) eggs = 'global' bacon() print(eggs)

結果↓
bacon local
spam lacal
bacon local
global

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2018/09/28 04:06 編集

ググって出てきた上位10件くらいには目を通した上での質問ですか? 調べればすぐ解説がヒットするので、google先生に教えてもらった方が良いような質問なのですが
Kyohei

2018/09/28 04:12

すみません、ググって色々なページ見て入るのですがなかなか理解に苦しみまして。。。
guest

回答2

0

ベストアンサー決まってますが、いろんな見方があった方が理解が深まるかと思うので
私は例を挙げて説明してみます。

以下のような状況を想定してください。
犬好きの大家さんがペット可のアパートを所有しています。
そのアパートにはAさんとBさんが住んでいて、それぞれ部屋の中で犬を一匹ずつ飼っています。
また、アパートの敷地内にも犬が一匹います。

Aさんの飼っている犬は「セイリュウ」という名前で、
Bさんの飼っている犬は「ビャッコ」という名前です。
アパートの敷地内にいる犬は「スザク」という名前でアパートの住人に可愛がられています。

これをpython的に書くと

python

1#=== Aさんの部屋 ===# 2def a_room(): 3 # ここの犬の名前は「セイリュウ」です 4 dog = 'セイリュウ' 5 # ここで犬の話をするとセイリュウが該当します 6 print("ここの" + dog + "ってたくましいよね") 7 8#=== Bさんの部屋 ===# 9def b_room(): 10 # ここの犬の名前は「ビャッコ」です 11 dog = 'ビャッコ' 12 # ここで犬の話をするとビャッコが該当します 13 print("ここの" + dog + "って可愛いよね") 14 # Aさんの部屋に移動します。 15 a_room() 16 # (Aさんの部屋から戻ったら)ここで犬の話をするとビャッコが該当します 17 print("ここの" + dog + "って可愛いよね") 18 19#=== 部屋の外(アパートの敷地内) ===# 20# ここの犬の名前は「スザク」です 21dog = 'スザク' 22# Bさんの部屋に移動します。 23b_room() 24# (Bさんの部屋から戻ったら)ここで犬の話をするとビャッコが該当します 25print("ここの" + dog + "って凛々しいよね")

こう書けます。
(実行してみてください)

いろんなところでdogを使っていますが、Aさんの部屋の犬とBさんの部屋の犬は
(どちらも犬ですが)別な犬だということはわかるでしょうか?

ここまでは質問文のコードをアパートと犬に置き換えたものです。
出力結果に納得いきましたでしょうか?


せっかくなので、関数内にdogがないバージョンを。

Cさんという新しい住人が入り、何もペットを飼っていないとします。

python

1#=== Cさんの部屋 ===# 2def c_room(): 3 # ここで犬の話をするとスザクが該当します 4 print("ここの" + dog + "ってかっこいいよね") 5 6### ↓最初のプログラムの最後に追加してください↓ ### 7c_room()

のようにCさんの部屋には犬がいないのに犬の名前を呼ぼうとしてみます。
(最初のプログラムにこのプログラムを追加して、実行してみてください。)
するとCさんは犬を飼っていないので、「ここの犬」はアパートの犬という解釈になります。


最後に、関数内だけである場合を見てみましょう。

Dさんが新しい住人として入り、猫を飼いました。
名前は「ゲンブ」です。

python

1#=== Dさんの部屋 ===# 2def d_room(): 3 cat = 'ゲンブ' 4 # ここで犬の話をするとスザクが該当します 5 print("ここの" + dog + "ってかっこいいよね") 6 # ここで猫の話をするとゲンブが該当します 7 print("ここの" + cat + "ってキュートだよね") 8 9### ↓最初のプログラムの最後に追加してください↓ ### 10d_room() 11print("ここの" + cat + "ってキュートだよね")

Dさんの部屋に移動し、 犬と猫の話をします。
その後、Dさんの部屋を出て猫の話をしますが、部屋の外には猫がいないので、
「は?部屋の外に猫なんていないけど?」とエラーを吐かれます。

(最後のprintをコメントアウトすると実行できます。)


多少無理矢理感は合ったかと思いますが、イメージとしてはこんな感じでしょうか。
理解しやすい表現は人によってまちまちなので、色んなサイトを見たりして自分にあう表現を見つけましょう。

投稿2018/09/28 04:35

dice142

総合スコア5158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kyohei

2018/09/28 14:32

dice142様ありがとうございます!抽象化されていて大変理解しやすく助かります!! かなりロジックが理解できました! これでどんどん進めそうです:) お忙しい中、ご丁寧に対応いただき感謝致します!
guest

0

ベストアンサー

スコープは「その変数にアクセスできる範囲はどこまでか」という概念です。グローバルスコープとはコード全体から呼び出せるという意味ですが、ローカルスコープは特定の部分からしか呼び出せないという意味です。
pythonでは、ローカルスコープは基本的に関数単位です。ある関数の中で定義した変数は、その関数の中からしか呼び出せません。他の関数の中からや、関数の外から呼ぼうとするとエラーになります。
逆に、どの関数にも属していないところで定義された変数は、他の関数の中からも呼び出すことができます。

質問のコードの場合、printはbacon内の2行目 -> spam内の2行目 -> bacon内の4行目 -> 全体の最後の行の順で行われています。
1番目, 2番目では、それぞれの関数内で定義されているeggsを出力します。グローバルスコープのeggsにもアクセスできますが、自分のローカルスコープに同じ名前の変数が定義されている場合はそちらを優先します。
重要なのは後半2つです。3番目では、baconからはspam内のeggsにはアクセスできません。そのため、spamの呼び出し後でもbacon localが返ります。
4番目では、グローバルスコープからはbaconやspam内のeggsにはアクセスできません。そのため、グローバルスコープで定義したeggsが使われglobalが返ります。

投稿2018/09/28 04:00

Udomomo

総合スコア1524

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kyohei

2018/09/28 04:14

Udomomo様ありがとうございます! 大変わかりやすく助かりました。 Udomomo様のご教授を糧にもっと難易度の高い質問ができるように精進致します。 貴重なお時間誠にありがとうございます:)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問