31

isPython (python 3.3) の学習を開始し、演算子を試していました。私はこれを試しました:

>>> 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

4

5 に答える 5

16

Ignacio の答えを少し拡張するには:is演算子は恒等演算子です。オブジェクトの同一性を比較するために使用されます。同じ内容の 2 つのオブジェクトを構築する場合、通常、オブジェクトの同一性が true になることはありません。Python の参照実装である CPython はコンテンツを個別に格納し、これらのオブジェクトはすべて同じ文字列コンテンツを参照するため、一部の小さな文字列に対して機能します。そのため、is演算子はそれらに対して true を返します。

ただし、これは CPython の実装の詳細であり、通常、CPython やその他の実装については保証されていません。したがって、この事実を使用することは、他の日に壊れる可能性があるため、悪い考えです。

文字列を比較するには、オブジェクトの等価性==を比較する演算子を使用します。2 つの文字列オブジェクトは、同じ文字が含まれている場合、等しいと見なされます。したがって、これは文字列を比較するときに使用する正しい演算子であり、オブジェクトIDを明示的に必要としない場合は一般的に避ける必要があります(例: )。isa is False


詳細に本当に興味がある場合は、CPython の文字列の実装をここで見つけることができます。繰り返しになりますが、これは実装の詳細であるため、これを機能させる必要はありません

于 2013-05-26T06:18:46.870 に答える
4

この演算子は、 具体的には、オブジェクトのメモリ アドレスを返す関数にis依存します。CPython は、文字 az と AZ のみを含む文字列に対して一貫したメモリ アドレスを持っているようです。idguaranteed to be unique among simultaneously existing objects.id

ただし、これは、文字列が変数に割り当てられている場合にのみ当てはまるようです。

ここで、"foo" の id と の id はa同じです。 aID をチェックする前に「foo」に設定されています。

>>> a = "foo"
>>> id(a)
4322269384
>>> id("foo")
4322269384

ただし、「bar」と等しくa設定する前に「bar」の id を確認すると、「bar」の id と の id が異なります。a

>>> id("bar")
4322269224
>>> a = "bar"
>>> id(a)
4322268984

「bar」に等しく設定したに「bar」の ID を再度確認すると、同じ ID が返されます。a

>>> id("bar")
4322268984

そのため、cPython は、a-zA-Z のみを含む文字列が変数に割り当てられている場合、これらの文字列に対して一貫したメモリ アドレスを保持しているようです。これがバージョンに依存している可能性も十分にあります。Macbook で python 2.7.3 を実行しています。他の人は、まったく異なる結果を得る可能性があります。

于 2013-05-26T06:59:22.043 に答える
1

実際、コードはオブジェクト ID (つまり、それらの物理アドレス) を比較することになります。したがって、あなたの比較の代わりに:

>>> b = 'is it the space?'
>>> a = 'is it the space?'
>>> a is b
False

できるよ:

>>> id(a) == id(b)
False

ただし、 a と b が直接比較されている場合は機能することに注意してください。

>>> id('is it the space?') == id('is it the space?')
True

実際、式では同じ静的文字列が共有されています。しかし、プログラムの規模では、単語のような文字列の共有のみが行われます (したがって、スペースも句読点もありません)。

この動作はどこにも文書化されておらず、実装の詳細であるため、依存しないでください。

于 2013-05-26T06:29:58.683 に答える
-1

「is」演算子は実際のオブジェクトを比較します。

c is dまた、false にする必要があります。私の推測では、python は何らかの最適化を行っており、その場合、それは同じオブジェクトです。

于 2013-05-26T06:18:47.690 に答える