Pythonクイズ#1 – a is 257

2020.12.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Pythonの構文は英語と似ていますので、Pythonは勉強しやすいと思います。簡単なのに上級プログラマーが驚く機能もあります。今日はその驚くところについての話です。

この記事はクイズのように使ってください。最初は問題を読んで解答を想像してみてください、その後に解答と説明も用意しています。

問題:出力はなんでしょうか?

>>> a = 256
>>> a is 256
#1 OUTPUT
>>> a = 257
>>> a is 257
#2 OUTPUT

想像できましたか?

解答

#1 OUTPUT - True

#2 OUTPUT - False

#1 OUTPUTはあたりまえですが #2 OUTPUTは驚きましたか?

説明

Cpython interpreterはスタート時にsmall integersをキャシングします。small integerの範囲は「-5, 256」です。この範囲から値が参照されたらキャッシュのオブジェクトが使われます。そのため、256を使う場合は新しいオブジェクトは作成されず、既存オブジェクトが使われます。上記例のaに設定した256とa is 256の256は同じオブジェクトです。

>>> a = 256
>>> id(a), id(256)
(9760320, 9760320)

>>> a = 257
>>> id(a), id(257)
(140706878847152, 140706877962448)

#2 OUTPUTがFalse理由はisオペレーターは値を比べず、オブジェクトのidを比べます。a is 256の場合は同じオブジェクトが比べられるので出力はTrueとなり、a is 257の場合は違うオブジェクトを比べてFalseになります。

注意

インテジャーの値を比べる時はisオペレーターを使わず代わりに'=='を使ってください

>>> a = 257
>>> a == 257
True