Web とスタック オーバーフローの質問を検索しましたが、この質問に対する回答が見つかりませんでした。私が行った観察は、Python 2.7.3 では、2 つの変数に同じ単一の文字列を割り当てる場合、たとえば、
>>> a = 'a'
>>> b = 'a'
>>> c = ' '
>>> d = ' '
次に、変数は同じ参照を共有します。
>>> a is b
True
>>> c is d
True
これは、いくつかの長い文字列にも当てはまります。
>>> a = 'abc'
>>> b = 'abc'
>>> a is b
True
>>> ' ' is ' '
True
>>> ' ' * 1 is ' ' * 1
True
ただし、参照が (予期せず) 共有されない場合が多数あります。
>>> a = 'a c'
>>> b = 'a c'
>>> a is b
False
>>> c = ' '
>>> d = ' '
>>> c is d
False
>>> ' ' * 2 is ' ' * 2
False
誰かがこの理由を説明してもらえますか?
インタープリターによって単純化/置換が行われたり、Python 文字列が特別な場合に最適化するために不変であるという事実を利用したキャッシングメカニズムがあると思われますが、私は何を知っていますか? str コンストラクターと copy.deepcopy 関数を使用して文字列のディープ コピーを作成しようとしましたが、文字列の参照の共有には一貫性がありません。
私がこれに問題を抱えている理由は、新しいスタイルの python クラスの clone メソッド用に書いているいくつかの単体テストで、文字列への参照の不等式をチェックするためです。