Pythonのif文でNone、空文字、0の判定をする時、思った通りに動作しないことがよくあるため、この記事でそれぞれの判定についてまとめます。
Bool変数(True,False)の判定
コマンドプロンプトで以下を実行して確認
True
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
a = True #判定1 a is True #True # a is not True #False #判定2 if a: print("aはTrue") #aはTrue # if not a: print("aはFalse") # ※戻り値なし # if a is True: print("aはTrue") #aはTrue # if a is not True: print("aはFalse" # ※戻り値なし |
False
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
b = False # b is True #False # b is not True #True # if b: print("bはTrue" # ※戻り値なし #if not b: print("bはFalse") #bはFalse # if b is True: print("bはTrue") # ※戻り値なし # if b is not True: print("bはFalse") #bはFalse |
空文字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
c = "" # c is True #False # c is not True: #True c is None #False c is not None #True len(c) #0 |
空文字はboolean(True,False)とも、Noneとも別。
長さが0の文字列
0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
d = 0 d is True #False d is not True #True d is False #False not d #True d=100 not d #False |
d=0の時、not d はTrueになる。
d=100の時、not dはFalseになる。
None
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
e = None e is None #True e is not None #False e == 0: #False not e #True if e: print("e") # ※戻り値なし if not e: print() |
・Noneはシングルトンオブジェクト
・シングルトンとはプログラム中に必ず1つしか存在しないオブジェクト
・Noneについては必ずis比較を行う
Null
・PythonにはNullがない
・Noneは指し示す先にNoneがあるが、Nullは指し示す先には何もないという意味で厳密には異なる
“==”と”is”の違い
==は値が同じであるかを判定する
isはオブジェクトが同じであるかを判定する。
二次元リストの作成
結論から書くと、二次元リストを作るにはリスト内包を使う。
1 2 |
list0 = [[i for i in range(3)] for j in range(3)] print(list0) |
詳細は以下の通り。
各要素が、同じ値、同じオブジェクトである二次元リストと、
各要素が、同じ値、異なるオブジェクトである二次元リストの作り方について整理。
以下は、二次元リストを違う手順で作成している。
1 2 3 4 5 6 7 |
list1 = [[1,2,3]]*3 list2 = [[i for i in range(3)] for j in range(3)] print(list1) #[[0,1,2],[0,1,2],[0,1,2]] print(list2) [[0,1,2],[0,1,2],[0,1,2]] |
list1とlist2は一見同じに見えるが実際は同じではない。
list1内の各リストは全て同じオブジェクト。
※全て同じオブジェクトなので値は当然全て同じになる
list2内の各リストは全て異なるオブジェクト。
※全てのリストは異なるオブジェクトだが、同じ値を持つ。
list1のある要素を変更すると、list1内の全ての要素が変化する↓
1 2 3 4 5 6 7 |
list1 = [[0,1,2]]*3 #list1 = [[1,2,3],[1,2,3],[1,2,3]]を #list1 = [[1,2,3],[1,100,3],[1,2,3]]に変えたい list1[1][1] = 100 print(list1) #[[0, 100, 2], [0, 100, 2], [0, 100, 2]] |
実行結果を見ると、list1内の3つのリストは全て、2が100に変化した。
これは、list1内の各リストが同じオブジェクトであることが理由。
なので、3つのリストのうち、どれか1つを変更すると、他の2つのリストも変化する。
3つのリストは、メモリ上の同じ場所を参照していることからこのような動作になる。
list2のある要素を変更すると、list2内で指定した要素だけが変化する↓
1 2 3 4 5 6 7 |
list2 = [[i for i in range(3)] for j in range(3)] #list2 = [[1,2,3],[1,2,3],[1,2,3]]を #list2 = [[1,2,3],[1,100,3],[1,2,3]]に変えたい list2[1][1] = 100 print(list2) #[[0, 1, 2], [0, 100, 2], [0, 1, 2]] |
実行結果を見ると、list2内の2番目のリストの2だけが100に変化した。
これは、list2内の各リストが、全て異なるオブジェクトであることが理由。
なので、3つのリストのうち、指定したリストだけが変化する。
3つのリストは、メモリ上でも異なる場所にそれぞれ保存されていることからこのような動作になる。
リスト内包を使うことで、同じ値で、異なるオブジェクトであるリストを作ることができる
コメント