ベストアンサー決まってますが、いろんな見方があった方が理解が深まるかと思うので
私は例を挙げて説明してみます。
以下のような状況を想定してください。
犬好きの大家さんがペット可のアパートを所有しています。
そのアパートには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
をコメントアウトすると実行できます。)
多少無理矢理感は合ったかと思いますが、イメージとしてはこんな感じでしょうか。
理解しやすい表現は人によってまちまちなので、色んなサイトを見たりして自分にあう表現を見つけましょう。