カテゴリ: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認定基礎試験の解説記事は今後も続けてみようと思いますが、
皆様の参考になれば幸いです。
繰り返しにはなりますが、受験には公式書籍があった方がいいですので
メインは書籍でインプットをしていきましょう!
ただ「本当にプログラミング自体が初心者で」という場合は公式書籍の前に
「スッキリシリーズ」のテキストから入ると挿絵や説明がかなり分かりやすく
初めての理解には役立つかもしれません。
私も未経験の新卒時には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