Python で書かれた数学パッケージ SAGE を使用しています。
ベクトルのセットを操作しようとしていますが、上記のエラー メッセージが引き続き表示されます。私はそれが私に何を言っているのかまったくわかりませんが、可変の意味は理解していますが、誰かが私に間違っていると言っていることをかなり単純な概念的な用語で説明できますか?
あなたは次のようなものを見つけていると思います
sage: V = vector([1,2,3])
sage: W = vector([3,4,5])
sage: set([V,W])
<snip>
TypeError: mutable vectors are unhashable
sage:
このデフォルト設定は、次の方法で修正できます。
sage: V.set_immutable(); W.set_immutable()
sage: set([V,W])
set([(3, 4, 5), (1, 2, 3)])
お役に立てれば。
set
ハッシュ可能なオブジェクトはsにのみ入れることができます:
セットオブジェクトは、個別のハッシュ可能なオブジェクトの順序付けられていないコレクションです。
Pythonの場合、オブジェクトは__hash__
またはと同様にメソッドを実装する必要があることを意味し__eq__
ます__cmp__
。
可変オブジェクトはそのようなメソッドを実装しておらず、に格納することはできませんset
。不変のシーケンスは、またはなどので保存set
できtuple
ますfrozenset
。
ドキュメントからの別の引用:
オブジェクトは、その存続期間中に変更されないハッシュ値(メソッドが必要)を持っている場合はハッシュ可能であり、他のオブジェクト(またはメソッド
__hash__()
が必要)と比較できます。等しいと比較するハッシュ可能なオブジェクトは、同じハッシュ値を持っている必要があります。__eq__()
__cmp__()
これらのデータ構造は内部でハッシュ値を使用するため、ハッシュ可能性により、オブジェクトはディクショナリキーおよびセットメンバーとして使用可能になります。
Pythonの不変の組み込みオブジェクトはすべてハッシュ可能ですが、変更可能なコンテナー(リストや辞書など)はハッシュ可能ではありません。ユーザー定義クラスのインスタンスであるオブジェクトは、デフォルトでハッシュ可能です。それらはすべて等しくなく比較され、それらのハッシュ値はそれら
id()
です。
これは、Pythonが「vectors」のコンテンツを使用してセットを構築できないことを意味します。「vectorobject」はそのコンテンツへの単なる「ポインタ」であるためです。コンテンツは「fixed」ではなく、同じものを再利用して変更できます。 vector vatiable(Pythonは、セットを機能させ続けるためにセットを再構築する必要があります)。
したがって、「set」は不変オブジェクト(タプル、文字列、数値など)に対してのみ使用できます。
例えば
>>> l1 = [1, 2, 3]
>>> l2 = [3, 4, 5]
>>> set([l1, l2])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
これは、l1とl2を変更できるためです(たとえば、.appendを使用)。
>>> t1 = (1, 2, 3)
>>> t2 = (3, 4, 5)
>>> set([t1, t2])
set([(3, 4, 5), (1, 2, 3)])
この場合、t1とt2の内容を変更することはできません。