1

私は、.NET オブジェクトと、その参照型と値型のフレームワークに非常に慣れています。Python オブジェクトは .NET オブジェクトと比べてどうですか? obj1 == obj2具体的には、 equality 、 hash-ability (つまり、dict に入れることができること)、および copyについて疑問に思っています。

たとえば、.NET の既定では、すべてのオブジェクトは参照型であり、それらの等価性とハッシュ コードはメモリ内のアドレスによって決定されます。さらに、変数を既存のオブジェクトに割り当てると、メモリ内のそのアドレスを指すようになるだけなので、コストのかかるコピーは発生しません。これはpythonでも同じようですが、完全にはわかりません。

編集:

2000 年に書かれた effbot からいくつかの有用な情報を見つけることができました。

オブジェクト

すべての Python オブジェクトには次のものがあります。

  • 一意の ID ( によって返される整数id(x))
  • タイプ ( によって返されるtype(x))
  • 一部のコンテンツ ID を変更することはできません。

タイプを変更することはできません。

一部のオブジェクトでは、コンテンツを変更できます (つまり、ID や型を変更する必要はありません)。

一部のオブジェクトでは、コンテンツを変更できません (詳細は後述)。

型は型オブジェクトによって表され、この型のオブジェクトについて詳しく知ることができます (オブジェクトが通常占有するメモリのバイト数、オブジェクトが持つメソッドなど)。

4

2 に答える 2

3

平等

: -__cmp__または__eq__メソッドが定義されていないオブジェクトを比較しようとすると、オブジェクトから比較を継承してエラーが発生しますobject。これは、行うことは行うことa > bと同等であることを意味しid(a) > id(b)ます。

このisキーワードは、2 つの変数が同じオブジェクトを指しているかどうかを確認するためにも使用されます。一方==、演算子は、比較するオブジェクトの__cmp__orメソッドを呼び出します。__eq__

ハッシュ可能性

__hash__: -メソッドが定義されている場合、オブジェクトはハッシュ可能です。すべての基本的なデータ型 (文字列とタプルを含む) には、ハッシュ関数が定義されています。クラスにメソッドが定義されていない場合__hash__、そのクラスは object からハッシュを継承しますobject

コピー中

: - copycopy.deepcopy、およびそれぞれのクラス メソッド__copy__および__deepcopy__. オブジェクトの階層をコピーするためにcopy、単一のオブジェクトをコピーするために使用します。deepcopydeepcopy

agf の提案で行われた編集。

于 2012-05-04T17:19:53.113 に答える
1

Python では、演算子__eq__を処理するメソッドを定義できます。==

オペレーターは、1 つのオブジェクトが他のオブジェクト同じisかどうかをチェックします。(より具体的には、1 つまたは 2 つのオブジェクトを参照する 2 つの変数)

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a == b
True
>>> a is b
False
>>> c = a
>>> c is a
True

さて、この例では type を使用しています。これは、すべての項目の等価性を比較するメソッドlistを定義するクラスと考えることができます。__eq__

ハッシュについても同様に__hash__、オブジェクトを識別する整数を返すメソッドをクラスで定義します。これは、ハッシュをサポートする基本型でも使用できます。関数を参照してくださいhash

于 2012-05-04T17:33:19.003 に答える