頻繁に使用されると予想される小さな整数と文字列の場合、Python は内部メモリの最適化を使用します。Python のすべての変数はメモリ オブジェクトへの参照であるため、Python はそのような小さな値を一度だけメモリに入れます。次に、同じ値が他の変数に割り当てられるたびに、その変数が既にメモリに保持されているオブジェクトを指すようにします。文字列と整数は不変であるため、これは機能します。変数値が変更された場合、事実上、変更されるのはこの変数によって使用される参照であり、元の値を持つメモリ内のオブジェクト自体は影響を受けません。
そのため、最初のケースの変数 foo1 と foo2 は、値 4 を持つメモリ内の同じ整数オブジェクトへの参照を保持するため、ID は同じです。
まず第一に、浮動小数点数は「小さく」ありません。次に、計算に応じてメモリ内の同じ 4.3 が 4.3123456789 および 4.31239874654 として保持される可能性があります (説明する数値の例にすぎません)。したがって、これら 2 つの値は 2 つの異なるオブジェクトですが、計算中および表示中の意味のある部分は同じ、つまり 4.3 のように見えます (実際、同じ意味のある浮動小数点数に対して、メモリ内には明らかにもっと多くの可能な値があります)。したがって、メモリ内の同じ浮動小数点数オブジェクトを再利用することは問題があり、結局のところ価値がありません。
これが、2 番目のケースで foo1 と foo2 がメモリ内の異なる浮動小数点オブジェクトを参照し、したがって異なる ID を持つ理由です。
浮動小数点数がメモリに保持される方法の詳細を参照してください。
http://floating-point-gui.de/
http://docs.python.org/2/tutorial/floatingpoint.html
また、Oracle docs には浮動小数点数に関する大きな記事があります。
@josliber、あなたがアドバイスしたように、再投稿する前に回答を編集しました。