みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

Pythonの組み込み定数について

以下は一見不可解なコードだが,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 を使うべきであることが分かります.