pythonのisと=,javaの==とequal(等しい判断)

3115 ワード

等しいかどうかを判断する
Pythonは対象が等しいか否かを判断する(==とis)
Pythonのオブジェクトには、次の3つの基本要素が含まれています.
  • id:オブジェクトを一意に識別するために使用され、メモリアドレスとして理解される.
  • type:オブジェクトのタイプを識別します.
  • value:オブジェクトの値;

  • ==2つのオブジェクトの内容が等しいかどうかを比較します.すなわち、2つのオブジェクトのvalueが等しいかどうかを比較します.idが等しいかどうかにかかわらず、デフォルトではオブジェクトの__が呼び出されます.eq__()メソッドis:2つのオブジェクトが完全に同じかどうか、すなわちidが等しいかどうかを比較します.
    すなわち、a is bがTrueであれば、a==bもTrueである
  • 文字列比較
  • a = 'hello'
    b = 'hello'
    print(a is b)
    print(id(a))
    print(id(b))
    
        :
    True
    1830826496176
    1830826496176
    
  • 数字比較
  • まず面白い現象を見てみましょう
    In[43]: a = 256
    In[44]: b = 256
    In[45]: a is b
    Out[45]: True
    In[46]: id(a)
    Out[46]: 140711685177712
    In[47]: id(b)
    Out[47]: 140711685177712
    In[48]: a = 257
    In[49]: b = 257
    In[50]: a is b
    Out[50]: False
    In[51]: id(a)
    Out[51]: 2097451837488
    In[52]: id(b)
    Out[52]: 2097451837648

    なぜa,bが257のときa is bがFalseなのか.
    Pythonは速度を最適化するために、整数の頻繁なメモリ領域の申請と破棄を避けるために、小さな整数オブジェクトプールを使用しています.
    Pythonの小整数の定義は[-5,256)であり、数字が-5から256の間でidが等しいだけで、この範囲を超えるとだめである.同じ理屈で、文字列オブジェクトにも類似のバッファプールがあり、区間範囲を超えると自然に等しくならない.
    これは、コマンドラインで実行される場合にのみ小さな整数キャッシュが使用されますが、ファイルで実行される場合、解釈器の一部が最適化されているため、結果は異なります.以下のようにします.
    x = 257
    y = 257
    print(id(x))
    print(id(y))
    print(x is y)
    
        :
    2177330411024
    2177330411024
    True
  • ユニット比較
  • x = (1, 2, 3)
    y = (1, 2, 3)
    print(x is y)
    print(id(x))
    print(id(y))
    
        :
    True
    3014830376024
    3014830376024
  • リスト比較
  • x = [1, 2, 3]
    y = [1, 2, 3]
    print(x == y)
    print(x is y)
    print(id(x))
    print(id(y))
    
        :
    True
    False
    2968991650248
    2968991650760
  • リスト付与値比較
  • x = [1, 2, 3]
    y = x
    print(x is y)
    print(id(x))
    print(id(y))
    
        :
    True
    2294971781576
    2294971781576
  • 辞書比較
  • x = {"a": 1, "b": 2, "b": 3}
    y = {"a": 1, "b": 2, "b": 3}
    print(x == y)
    print(x is y)
    print(id(x))
    print(id(y))
    
        :
    True
    False
    2522908527576
    2522908269848
  • 集合比較
  • x = set([1, 2, 3])
    y = set([1, 2, 3])
    print(x == y)
    print(x is y)
    print(id(x))
    print(id(y))
    
        :
    True
    False
    2080395955784
    2080414590120

    まとめ:
    x,yが文字列,整数,メタグループ(いずれも可変タイプ)の場合,xとyの値が同じであれば,x is yはFalseであることがわかる.
    しかし、リスト、辞書、集合(いずれも可変タイプ)の場合、x is yはFalse、リストが値を付与する場合はTrueである.
    ==に比べてisの計算速度は速く、リロードできないため、特殊な関数呼び出しを行わず、関数呼び出しのオーバーヘッドを少なくして2つの整数idを直接比較します.a==bはa._に等しいeq__(b).objectから継承_eq__メソッドは2つのオブジェクトのidを比較し,結果はisと同じである.しかし、多くのPythonのオブジェクトはobjectの__を上書きします.eq__メソッドで、コンテンツの関連比較を定義するので、オブジェクト属性の値を比較します.
    変数と単一の値を比較する場合は、isを使用します.現在、isが最もよく使われているのは、対象がNoneかどうかを判断することです.
    pythonの可変タイプ可変タイプについては、以下を参照してください.https://www.runoob.com/python/python-variable-types.html
    pythonの割り当て、浅いコピー、深いコピーは、次のように参照できます.https://blog.csdn.net/bufengzj/article/details/90486991
    Javaはオブジェクトが等しいかどうかを判断する(==とequal)
    JAvaにはisはなく、==とequalがあります.
    ==2つの変数自体の値、すなわち2つのオブジェクトのメモリ内のヘッダアドレス(pythonのisと同様)を比較します.
    equals:変数に含まれる内容が同じかどうかを比較します(pythonの==に似ています).
    JAvaの具体的な参考:https://www.cnblogs.com/weibanggang/p/9457757.html