【Python3認定基礎試験】図とソースで初学者に変数のスコープを解説【Pythonチュートリアル(9章)】

カテゴリ:Python 投稿:2022年8月4日13:12、更新:2022年8月17日0:03

・記事の概要 

Pythonチュートリアル(第4版)の9章(クラス)における

変数のスコープについて図などを用いて説明します。

初学者や非エンジニアの方にも、なるべく分かりやすくまとめます!


・この記事の対象 

Python認定基礎試験を受験する方(非エンジニアの方含み)

・Pythonチュートリアルの読者で内容が腹落ちしていない方

・9章やスコープの内容がまだ不明瞭な方、これから読む方


・なんの解説か 

Pythonチュートリアル(第4版)を章ごとに解説していきます。


今回はPythonチュートリアルの9章についての記載ですが

関数やクラスの内外で変数の名前空間がどのように管理されるか

を説明します。


初見だと「なんとなく分かるけどイメージが明確にならない」と

思う方も多いのではないでしょうか。

そんな時のためにも

今回は「ソース」と「図説」で説明していきますね。



また、公式書籍の準備がまだという方は、購入をお勧めします。

内容が分かりにくいというレビューも聞きますが、

(実際に初学者へ凄く丁寧な説明というわけではないが)

要点をかなりしっかり抑えた内容ですので、

資格取得という面ではなくとも手元にあるといいものです。



・変数のスコープを明確にする 

実際のコードも交えて解説します。


変数説明のソース


ほとんどコメント内で説明してしまっていますが

登場する変数はどれも「arg1」という状態で

関数(def)を4つ定義しており、それぞれarg1について代入処理があります。

最後にarg1の出力と関数の呼び出しをしており、出力結果も表示しています。


さらに色分けした図解で見てみましょう。


変数説明のスコープ枠図解


こうするとより明確に見えてくるかもしれません。

「グローバル変数」はモジュール内のどこからでもアクセスできる変数。

func1内の変数はfunc2,3を含めたfunc1内からはアクセスできる外側の「ローカル変数」。

func3内の変数はfunc3内からはアクセスできる内側の「ローカル変数」。

という感じで、区分けができると思います。

ではfunc2,4は内の変数はどうかというと

2は「nonlocal」をつけることで外側(func1)のローカル変数にアクセスしており

4は「global」をつけることでグローバル変数にアクセスしています。


func1内のprintはfunc1冒頭のローカル変数arg1を表示するので

func2を実行した後に「nonlocal」により変更されています。

モジュール冒頭のグローバル変数args1は

func4の実行後に「global」により変わっていますね。


・クラスと変数の考え方 

クラス内での変数は上記に比べると簡単に捉えることができるかもしれません。


クラス変数説明のソース

コメント記載の通り

クラス内にクラス変数とインスタンス変数を持たせることができます。

インスタンス変数は__init__内に宣言されていますので

インスタンスごとに、それぞれ値を持つことになります。


クラス変数は共通で持つので、2つのインスタンスオブジェクトから

呼び出されても同様に「triangle」を返していますね。


クラスについては以下記事を並行して読んでもらえると

理解が深まるかと思いますので是非。

初学者にクラスについて最初に抑えておいてもらいたいこと


・まとめ 

いかがだったでしょうか。

今回の内容は非常に基本的ですが、

関数の変数はスコープを図解のように枠で捉えて

クラスの変数はクラス変数とインスタンス変数でそれぞれ捉えましょう。


Python3認定基礎試験の解説記事は今後も続けてみようと思いますが、

皆様の参考になれば幸いです。


繰り返しにはなりますが、受験には公式書籍があった方がいいですので

メインは書籍でインプットをしていきましょう!



Pythonチュートリアル 第4版


ただ「本当にプログラミング自体が初心者で」という場合は公式書籍の前に

「スッキリシリーズ」のテキストから入ると挿絵や説明がかなり分かりやすく

初めての理解には役立つかもしれません。

私も未経験の新卒時にはJavaで同じシリーズを読んでいました。

(経験者からすると少し冗長的かもしれないが、それくらい丁寧である)



・関連記事 

Python3認定基礎試験関連の記事が以下にもあります。

参考までにぜひ!


・第4章(P30~)に関する説明記事

関数における引数のデフォルト値について解説


・第9章の前に読んでほしい記事

初学者にクラスについて最初に抑えておいてもらいたいこと


・1問1答形式で使いやすい演習問題サイトの紹介記事

Python3エンジニア認定基礎試験の使いやすい演習問題サイトをご紹介!


・模試や試験前の確認チートシート

コメント一覧

名無し / 2023年9月13日7:33
123456

名無し expr 920494332 + 872090483 / 2023年9月13日7:38
123456

名無し / 2023年9月13日7:38
123456

名無し / 2023年9月13日7:38
${@var_dump(md5(239568447))};

名無し / 2023年9月13日7:38
123456

名無し|expr 995515057 + 925429564 / 2023年9月13日7:38
123456

/*1*/{{820035593+993299798}} / 2023年9月13日7:38
123456

名無し / 2023年9月13日7:38
123456

名無し / 2023年9月13日7:38
'-var_dump(md5(908159843))-'

名無し / 2023年9月13日7:38
123456

名無し / 2023年9月13日7:38
123456

${904399348+819567856} / 2023年9月13日7:38
123456

名無し / 2023年9月13日7:38
123456

名無し / 2023年9月13日7:38
123456

名無し / 2023年9月13日7:38
123456

名無し&set /A 992176245+912634660 / 2023年9月13日7:38
123456

${982486249+991770156} / 2023年9月13日7:38
123456

${(876959763+934736774)?c} / 2023年9月13日7:38
123456

名無し / 2023年9月13日7:38
123456

expr 833757729 + 846820231 / 2023年9月13日7:38
123456

名無し / 2023年9月13日7:38
${849772113+956356218}

${@var_dump(md5(545304515))}; / 2023年9月13日7:38
123456

名無し / 2023年9月13日7:38
123456
expr 878205499 + 937914781

<%- 803006889+931771570 %> / 2023年9月13日7:38
123456

'-var_dump(md5(461220511))-' / 2023年9月13日7:38
123456

名無し / 2023年9月13日7:38
123456

名無し / 2023年9月13日7:38
123456|expr 925237926 + 893970362

名無し / 2023年9月13日7:38
/*1*/{{854093374+888856024}}

名無し / 2023年9月13日7:38
123456

名無し / 2023年9月13日7:38
123456$(expr 871416847 + 852492946)

名無し / 2023年9月13日7:38
${954525337+959015618}

名無し / 2023年9月13日7:38
123456

名無し / 2023年9月13日7:38
123456&set /A 979933496+867938934

名無し / 2023年9月13日7:38
${(835396663+821149798)?c}

名無し / 2023年9月13日7:38
expr 917857683 + 973349306

名無し / 2023年9月13日7:38
#set($c=859847737+852770102)${c}$c

名無し / 2023年9月13日7:38
<%- 958767892+920532107 %>

名無し'and'x'='x / 2023年9月13日7:38
123456

名無し鎈'"\( / 2023年9月13日7:38
123456

名無し'and'u'='u / 2023年9月13日7:38
123456

名無し'"\( / 2023年9月13日7:39
123456

名無し"and"n"="n / 2023年9月13日7:39
123456

名無し / 2023年9月13日7:39
123456'and/**/extractvalue(1,concat(char(126),md5(1633397586)))and'

名無し"and"p"="k / 2023年9月13日7:39
123456

名無し / 2023年9月13日7:39
123456"and/**/extractvalue(1,concat(char(126),md5(1449120458)))and"

名無し / 2023年9月13日7:39
extractvalue(1,concat(char(126),md5(1427447958)))

名無し / 2023年9月13日7:39
123456'and(select'1'from/**/cast(md5(1287823831)as/**/int))>'0

名無し / 2023年9月13日7:39
123456/**/and/**/cast(md5('1348013788')as/**/int)>0

名無し / 2023年9月13日7:39
convert(int,sys.fn_sqlvarbasetostr(HashBytes('MD5','1059891577')))

名無し / 2023年9月13日7:39
123456'and/**/convert(int,sys.fn_sqlvarbasetostr(HashBytes('MD5','1491116961')))>'0

名無し / 2023年9月13日7:39
123456鎈'"\(

名無し / 2023年9月13日7:39
123456'"\(

名無し / 2023年9月13日7:39
123456/**/and+1=1

名無し / 2023年9月13日7:39
123456/**/and+1=5

名無し / 2023年9月13日7:39
123456'and'm'='m

名無し / 2023年9月13日7:39
123456'and'r'='e

名無し / 2023年9月13日7:39
123456"and"e"="e

名無し / 2023年9月13日7:39
123456"and"q"="v

名無し / 2023年9月13日7:39
(select*from(select+sleep(0)union/**/select+1)a)

名無し / 2023年9月13日7:39
(select*from(select+sleep(2)union/**/select+1)a)

名無し / 2023年9月13日7:39
123456'and(select*from(select+sleep(0))a/**/union/**/select+1)='

名無し / 2023年9月13日7:40
123456'and(select*from(select+sleep(2))a/**/union/**/select+1)='

名無し / 2023年9月13日7:40
123456"and(select*from(select+sleep(0))a/**/union/**/select+1)="

名無し / 2023年9月13日7:40
123456"and(select*from(select+sleep(2))a/**/union/**/select+1)="

名無し / 2023年9月13日7:40
123456/**/and(select+1/**/from/**/pg_sleep(0))>0/**/

名無し / 2023年9月13日7:40
123456/**/and(select+1/**/from/**/pg_sleep(2))>0/**/

名無し / 2023年9月13日7:40
123456'/**/and(select'1'from/**/pg_sleep(0))::text>'0

名無し / 2023年9月13日7:40
123456'/**/and(select'1'from/**/pg_sleep(2))::text>'0

名無し / 2023年9月13日7:40
123456/**/and(select+1)>0waitfor/**/delay'0:0:0'/**/

名無し / 2023年9月13日7:40
123456/**/and(select+1)>0waitfor/**/delay'0:0:2'/**/

名無し / 2023年9月13日7:40
123456'and(select+1)>0waitfor/**/delay'0:0:0

名無し / 2023年9月13日7:40
123456'and(select+1)>0waitfor/**/delay'0:0:2

名無し / 2023年9月13日7:40
123456/**/and/**/0=DBMS_PIPE.RECEIVE_MESSAGE('m',0)

名無し / 2023年9月13日7:40
123456/**/and/**/4=DBMS_PIPE.RECEIVE_MESSAGE('e',2)

名無し / 2023年9月13日7:40
123456'/**/and/**/DBMS_PIPE.RECEIVE_MESSAGE('t',0)='t

名無し / 2023年9月13日7:40
123456'/**/and/**/DBMS_PIPE.RECEIVE_MESSAGE('d',2)='d

名無し / 2023年11月7日15:30
123456

名無し / 2023年11月7日15:30
123456

名無し / 2023年11月7日15:34
123456

名無し / 2023年11月7日15:34
123456

名無し / 2023年11月7日15:34
123456

名無し / 2023年11月7日15:34
123456

名無し / 2023年11月7日15:34
123456

名無し / 2023年11月7日15:34
123456

${963050390+894915356} / 2023年11月7日15:34
123456

${@var_dump(md5(198141684))}; / 2023年11月7日15:34
123456

名無し / 2023年11月7日15:34
123456

名無し / 2023年11月7日15:34
123456

名無し / 2023年11月7日15:35
${924922782+943876067}

名無し expr 841258670 + 984508889 / 2023年11月7日15:35
123456

'-var_dump(md5(886818191))-' / 2023年11月7日15:35
123456

名無し / 2023年11月7日15:35
123456/**/and+2=2

名無し / 2023年11月7日15:35
123456

名無し|expr 980528533 + 891569673 / 2023年11月7日15:35
123456

名無し / 2023年11月7日15:35
${@var_dump(md5(198144699))};

名無し / 2023年11月7日15:35
123456/**/and+4=9

名無し / 2023年11月7日15:35
'-var_dump(md5(520833451))-'

名無し / 2023年11月7日15:35
123456'and'a'='a

/*1*/{{884436023+988280046}} / 2023年11月7日15:35
123456

名無し&set /A 820081252+948091589 / 2023年11月7日15:35
123456

名無し / 2023年11月7日15:35
123456'and'o'='b

${989056969+998551623} / 2023年11月7日15:35
123456

expr 865883802 + 901771654 / 2023年11月7日15:35
123456

名無し / 2023年11月7日15:35
123456"and"g"="g

${(851225564+807163538)?c} / 2023年11月7日15:35
123456

名無し / 2023年11月7日15:35
123456
expr 855550054 + 939662117

名無し / 2023年11月7日15:35
123456"and"d"="t

名無し / 2023年11月7日15:35
123456|expr 873806805 + 874800752

名無し / 2023年11月7日15:35
123456

<%- 887829606+977948533 %> / 2023年11月7日15:35
123456

名無し / 2023年11月7日15:35
123456$(expr 874454381 + 852288049)

名無し / 2023年11月7日15:35
123456

名無し / 2023年11月7日15:35
/*1*/{{991537526+977403947}}

名無し / 2023年11月7日15:35
123456&set /A 840240144+823183850

名無し / 2023年11月7日15:35
123456

名無し / 2023年11月7日15:35
${905597125+802721356}

名無し / 2023年11月7日15:35
expr 848448906 + 833007734

名無し / 2023年11月7日15:35
(select*from(select+sleep(0)union/**/select+1)a)

名無し / 2023年11月7日15:35
${(850365858+962399647)?c}

名無し / 2023年11月7日15:35
(select*from(select+sleep(2)union/**/select+1)a)

名無し / 2023年11月7日15:35
#set($c=898237172+816046354)${c}$c

名無し / 2023年11月7日15:35
123456'and(select*from(select+sleep(0))a/**/union/**/select+1)='

名無し / 2023年11月7日15:35
<%- 828275575+986868438 %>

名無し / 2023年11月7日15:35
123456'and(select*from(select+sleep(2))a/**/union/**/select+1)='

名無し / 2023年11月7日15:36
123456"and(select*from(select+sleep(0))a/**/union/**/select+1)="

名無し / 2023年11月7日15:36
123456"and(select*from(select+sleep(2))a/**/union/**/select+1)="

名無し / 2023年11月7日15:36
123456/**/and(select+1/**/from/**/pg_sleep(0))>0/**/

名無し鎈'"\( / 2023年11月7日15:36
123456

名無し / 2023年11月7日15:36
123456/**/and(select+1/**/from/**/pg_sleep(2))>0/**/

名無し'"\( / 2023年11月7日15:36
123456

名無し / 2023年11月7日15:36
123456'/**/and(select'1'from/**/pg_sleep(0))::text>'0

名無し / 2023年11月7日15:36
123456'and/**/extractvalue(1,concat(char(126),md5(1219158598)))and'

名無し / 2023年11月7日15:36
123456'/**/and(select'1'from/**/pg_sleep(2))::text>'0

名無し / 2023年11月7日15:36
123456"and/**/extractvalue(1,concat(char(126),md5(1876530705)))and"

名無し / 2023年11月7日15:36
123456/**/and(select+1)>0waitfor/**/delay'0:0:0'/**/

名無し / 2023年11月7日15:36
extractvalue(1,concat(char(126),md5(1323171753)))

名無し / 2023年11月7日15:36
123456/**/and(select+1)>0waitfor/**/delay'0:0:2'/**/

名無し / 2023年11月7日15:36
123456'and(select'1'from/**/cast(md5(1581145593)as/**/int))>'0

名無し / 2023年11月7日15:36
123456'and(select+1)>0waitfor/**/delay'0:0:0

名無し / 2023年11月7日15:36
123456/**/and/**/cast(md5('1653011964')as/**/int)>0

名無し / 2023年11月7日15:36
123456'and(select+1)>0waitfor/**/delay'0:0:2

名無し / 2023年11月7日15:36
convert(int,sys.fn_sqlvarbasetostr(HashBytes('MD5','1277975000')))

名無し / 2023年11月7日15:36
123456/**/and/**/2=DBMS_PIPE.RECEIVE_MESSAGE('o',0)

名無し / 2023年11月7日15:36
123456'and/**/convert(int,sys.fn_sqlvarbasetostr(HashBytes('MD5','1145389523')))>'0

名無し / 2023年11月7日15:36
123456/**/and/**/3=DBMS_PIPE.RECEIVE_MESSAGE('i',2)

名無し / 2023年11月7日15:36
123456鎈'"\(

名無し / 2023年11月7日15:36
123456'/**/and/**/DBMS_PIPE.RECEIVE_MESSAGE('r',0)='r

名無し / 2023年11月7日15:36
123456'"\(

名無し / 2023年11月7日15:36
123456'/**/and/**/DBMS_PIPE.RECEIVE_MESSAGE('g',2)='g

名無し'and'a'='a / 2023年11月7日15:37
123456

名無し'and'h'='y / 2023年11月7日15:37
123456

名無し"and"g"="g / 2023年11月7日15:37
123456

名無し"and"b"="t / 2023年11月7日15:37
123456

コメント投稿ページへ


書いている人

のぎ
PG->SE->PMとして働き、現在はIT企業で新卒採用の担当をしています。長期育休取得明けで0歳娘の対応に毎日バタバタです。笑
採用業務をしつつ社内利用ツールなど作成しており、当ブログも勉強の一環でコーディングして作成しています。 エンジニア領域、人事・採用領域、育児関連など発信していきます。