にしのクエスト2

情報処理技術者試験と資格学校講師の日常

20210620102927

pythonで学ぶ超初心者プログラミング (おまけ)変数のスコープの癖がすごい

プログラミング超初心者向けの連載です。

目標は高校生が「共通テスト」ないしは「基本情報処理技術者」
でPythonライクな疑似言語に困らないレベルにすることです。
少しずつ進みつつ、超簡単に説明していく所存でございます。

ぜひ、エディタ片手に実行しながらお読みくださいませ。

セットアップの記事はこちらです。

www.nsnq.tech

 

今回は閑話休題です

Python、どうでしょうか?

プログラミング経験者の皆様は「便利じゃん」と思う方もいる
反面、「おいおい」と思われる方もいるでしょうね。

さて、今回は私がハマったお話を書きます。


(まず、C#で書いてみます)

int a=0;

void hoge(){

      a=5;
      b=10;
      a=a+b;
}
hoge();
printf(a)

(pythonに直してみます)

a=0
def hoge():
       a=5
       b=10

       a=a+b

hoge()
print(a)


えっと。
前者は当然のように15と表示されて。
後者は0って表示されますの。
なんで?

a=0
def hoge():
       a=5
       b=10

       a=a+b

hoge()
print(a)


実はグローバルに見える先頭のaと
関数の中にあるaは

違う変数であると考えるのがPython

なので、関数の中でaを定義してしまうと、そのaを
別物として扱ってしまいます。

これまでのようにグローバル的に扱いたい場合は

a=0
def hoge():
       global a
  a=5
       b=10

       a=a+b

hoge()
print(a)

わざわざ、このaは外のaのことだからね!
っていってあげなきゃダメです。

もしくは引数を使って

a=0
def hoge(a):
       b=10
       a=a+b

hoge(5)
print(a)

こうすれば解決できそうですね!

これがわからんくて、しばらく悩んだ話でした。
とほほ。

続きます!