pythonのisと=,javaの==とequal(等しい判断)
等しいかどうかを判断する
Pythonは対象が等しいか否かを判断する(==とis)
Pythonのオブジェクトには、次の3つの基本要素が含まれています. id:オブジェクトを一意に識別するために使用され、メモリアドレスとして理解される. type:オブジェクトのタイプを識別します. value:オブジェクトの値;
==2つのオブジェクトの内容が等しいかどうかを比較します.すなわち、2つのオブジェクトのvalueが等しいかどうかを比較します.idが等しいかどうかにかかわらず、デフォルトではオブジェクトの__が呼び出されます.eq__()メソッドis:2つのオブジェクトが完全に同じかどうか、すなわちidが等しいかどうかを比較します.
すなわち、a is bがTrueであれば、a==bもTrueである文字列比較 数字比較 まず面白い現象を見てみましょう
なぜa,bが257のときa is bがFalseなのか.
Pythonは速度を最適化するために、整数の頻繁なメモリ領域の申請と破棄を避けるために、小さな整数オブジェクトプールを使用しています.
Pythonの小整数の定義は[-5,256)であり、数字が-5から256の間でidが等しいだけで、この範囲を超えるとだめである.同じ理屈で、文字列オブジェクトにも類似のバッファプールがあり、区間範囲を超えると自然に等しくならない.
これは、コマンドラインで実行される場合にのみ小さな整数キャッシュが使用されますが、ファイルで実行される場合、解釈器の一部が最適化されているため、結果は異なります.以下のようにします.ユニット比較 リスト比較 リスト付与値比較 辞書比較 集合比較
まとめ:
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
Pythonは対象が等しいか否かを判断する(==とis)
Pythonのオブジェクトには、次の3つの基本要素が含まれています.
==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