以下は一見不可解なコードだが,Pythonでエラーせず実行される.
def a(): ... assert id(a()) == id(None) assert id(1 == 1) == id(True) assert id(1 == 0) == id(False) assert id(...) == id(Ellipsis)
シングルトンの組み込み定数
Pythonにはシングルトンとして定義されている組み込み定数 None, True, False, Ellipsisがある*1.
None, True, Falseはどこでどのように定義しても,同じidを持つので.
id(a()) == id(None) は関数がデフォルトでNoneを返すことを利用している.
1==1 は Trueとなるので,id(1 == 1) == id(True) は常に成り立つ.
1==0 は Falseとなるので,assert id(1 == 0) == id(False) は常に成り立つ.
...はEllipsisのことで,passと同じ意味であるため,id(...) == id(Ellipsis) は常に成り立つ.
is演算子
オブジェクトのidを比較するには==よりもisが速いので,以下のように書き換えるのが望ましい.
def a(): ... assert a() is None assert (1==1) is True assert (1==0) is False assert ... is Ellipsis
以上より,組み込み定数については is を使うべきであることが分かります.