私はPython(python 3.3)の学習を開始し、is
演算子を試していました。私はこれを試しました:
>>> b = 'is it the space?'
>>> a = 'is it the space?'
>>> a is b
False
>>> c = 'isitthespace'
>>> d = 'isitthespace'
>>> c is d
True
>>> e = 'isitthespace?'
>>> f = 'isitthespace?'
>>> e is f
False
スペースと疑問符is
が異なる動作をするようです。どうしたの?
編集:私はを使用する必要があることを==
知っていますが、なぜis
このように動作するのかを知りたかっただけです。
警告:この回答は、特定のPythonインタープリターの実装の詳細に関するものです。文字列をis
==悪い考えと比較する。
まあ、少なくともcpython3.4 / 2.7.3の場合、答えは「いいえ、空白ではありません」です。空白だけではありません:
2つの文字列リテラルは、英数字であるか、同じブロック(ファイル、関数、クラス、または単一のインタープリターコマンド)に存在する場合、メモリを共有します
文字列に評価される式は、定数と2項/単項演算子を使用して作成され、結果の文字列が21文字より短い場合に限り、文字列リテラルを使用して作成されたものと同じオブジェクトになります。
単一の文字は一意です。
英数字の文字列リテラルは常にメモリを共有します:
>>> x='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
>>> y='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
>>> x is y
True
英数字以外の文字列リテラルは、囲んでいる構文ブロックを共有する場合に限り、メモリを共有します。
(通訳)
>>> x='`!@#$%^&*() \][=-. >:"?<a'; y='`!@#$%^&*() \][=-. >:"?<a';
>>> z='`!@#$%^&*() \][=-. >:"?<a';
>>> x is y
True
>>> x is z
False
(ファイル)
x='`!@#$%^&*() \][=-. >:"?<a';
y='`!@#$%^&*() \][=-. >:"?<a';
z=(lambda : '`!@#$%^&*() \][=-. >:"?<a')()
print(x is y)
print(x is z)
出力:True
およびFalse
単純なバイナリ演算の場合、コンパイラーは非常に単純な定数伝播(peephole.cを参照)を実行しますが、文字列の場合は、結果の文字列が21文字より短い場合にのみ実行されます。この場合、前述のルールが有効になります。
>>> 'a'*10+'a'*10 is 'a'*20
True
>>> 'a'*21 is 'a'*21
False
>>> 'aaaaaaaaaaaaaaaaaaaaa' is 'aaaaaaaa' + 'aaaaaaaaaaaaa'
False
>>> t=2; 'a'*t is 'aa'
False
>>> 'a'.__add__('a') is 'aa'
False
>>> x='a' ; x+='a'; x is 'aa'
False
もちろん、単一の文字は常にメモリを共有します:
>>> chr(0x20) is ' '
True
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加