ホームページ  >  記事  >  バックエンド開発  >  Python の演算子「==」と「is」の違いの分析

Python の演算子「==」と「is」の違いの分析

高洛峰
高洛峰オリジナル
2016-10-17 11:19:521458ブラウズ

前書き

2 つの演算子 is と == の違いについて説明する前に、まず Python のオブジェクトに含まれる 3 つの基本要素、つまり id (ID)、Python type() (データ型)、および value (価値)。 is と == は両方ともオブジェクトの比較と判定に使用されますが、オブジェクトの比較と判定の内容が異なります。具体的な違いを見てみましょう。

Python では 2 つのオブジェクトが等しいかどうかを比較する方法が 2 つあり、その違いは簡単に言うと次のとおりです。

は 2 つの参照が同じオブジェクトを指しているかどうかを比較する (参照比較) です。

== は 2 つのオブジェクトが等しいかどうかを比較します。

>>> a = [1, 2, 3]
>>> b = a
>>> b is a # a的引用复制给b,他们在内存中其实是指向了用一个对象
True 
>>> b == a # 当然,他们的值也是相等的
True
>>> b = a[:] # b通过a切片获得a的部分,这里的切片操作重新分配了对象,
>>> b is a # 所以指向的不是同一个对象了
False
>>> b == a # 但他们的值还是相等的
True
の実装原理
は、両者が同じオブジェクトであるかどうかを比較するので、比較されるのはメモリアドレス(IDが同じかどうか)です。
== は値の比較です。 int、str などの不変オブジェクトは、値を直接比較します。 Python に既知のオブジェクトの場合、比較のために __eq__ 関数が呼び出されます。 (実際には、既知のオブジェクトも組み込みの __eq__ 関数を通じて比較する必要があります)。カスタム オブジェクトの場合、__eq__ 関数が実装されている場合は比較されます。実装されていない場合、結果は == と同じになります。

オブジェクト キャッシュ メカニズム

Python は比較的小さいオブジェクトをキャッシュします。次に比較的小さいオブジェクトが使用されると、キャッシュ領域内を検索します。新しいメモリは開かれませんが、引き続きキャッシュされます。小さなオブジェクトのアドレスに新しい値を割り当てます。例:

>>> c = 1
>>> d = 1
>>> print(c is d) 
True
  
>>> 1000 is 10**3
False
>>> 1000 == 10**3
True

代入は計算され、バッファ領域を使用しません。これは最初のコード例からわかります。

文字列の場合、intern 関数を使用してバッファの使用を強制できます。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。