3

これは予想される動作だと思いますが、私が行った調査が空白になっているため、理由を確認して調べたいと思います。

データを取得し、カスタムクラスの新しいインスタンスを作成して、それをリストに追加する関数があります。クラスには変数が含まれているだけです。

次に、プロトコル2をバイナリとして使用して、そのリストをファイルにピクルスします。後でスクリプトを再実行し、ソースからデータを再プルします。テスト用に、カスタムクラスインスタンスを含む新しいリストを作成し、データをソースに保持します。同じデータ。

ピクルスファイルをリロードします

今私がするとき:

print source_list == pickle_list

これは常に戻ってきFalseます。リストを印刷したり、構造を調べたりすると、まったく同じように見える理由がわかりません。

どんなアイデアも素晴らしいでしょう、これは私が分類する必要がある私の最後の少しです。

4

2 に答える 2

5

あなたのクラスはおそらく意味のあるものを定義していない__eq__ので、オブジェクトのアイデンティティについて比較されています。picklesからロードされたクラスは、生成されたリスト内のクラスと同じオブジェクトではないため(同じデータを持っていても)、を取得しますFalse

于 2012-03-02T08:35:28.543 に答える
2

同じクラスの2つのオブジェクトを比較すると、内容が同じであっても、デフォルトでFalseが生成されます(同じ単一のオブジェクトでない限り)。つまり、デフォルトでは、同じクラスの2つの直感的に「同一の」オブジェクトは異なると見なされます。次に例を示します。

>>> class C(object):
...     def __init__(self, value):
...         self.value = value
...         
>>> 
>>> C(12) == C(12)
False

__eq__()カスタムクラスで(および)を定義__ne__()して、同じデータを含むオブジェクトに対してTrue(それぞれFalse)が得られるようにします。詳細については、公式ドキュメントをご覧ください。上記の例の場合、これは次のようになります。

>>> class C(object):
...     # ...
...     def __eq__(self, other):
...         return self.value == other.value
...     def __ne__(self, other):
...         return not self == other  # More general than self.value != other.value
...     
>>> C(12) == C(12)  # __eq__() is called
True
>>> C(12) != C(12)  # __ne__() is called
False
于 2012-03-02T08:35:16.663 に答える