文字列のインターンと関係があると思います。本質的には、一部の操作のパフォーマンスを向上させるために、個別の文字列のコピーを1つだけ保存するという考え方です。
基本的に、機能する理由a is b
は、(ご想像のとおり)どちらの場合もPythonによって参照される不変の文字列が1つあるためです。文字列が大きい場合(およびおそらく私が理解していない他のいくつかの要因)、これは実行されません。そのため、2番目の例ではFalseが返されます。
編集:そして実際、奇妙な振る舞いはインタラクティブな環境の副作用のようです。同じコードをPythonスクリプトに配置すると、両方ともTruea is b
を返します。ktr is ptr
a="poi"
b="poi"
print a is b # Prints 'True'
ktr = "today is a fine day"
ptr = "today is a fine day"
print ktr is ptr # Prints 'True'
Pythonがソースファイルを解析し、その中の重複する文字列リテラルを探すのは簡単なので、これは理にかなっています。文字列を動的に作成すると、スクリプト内でも動作が異なります。
a="p" + "oi"
b="po" + "i"
print a is b # Oddly enough, prints 'True'
ktr = "today is" + " a fine day"
ptr = "today is a f" + "ine day"
print ktr is ptr # Prints 'False'
それでもTrueになる理由についてa is b
は、割り当てられた文字列が、インターンされたコレクションをすばやく検索できるほど小さいのに、もう1つはそうではないのではないでしょうか。