Pythonのセットは変更可能ですか?
言い換えれば、私がこれを行う場合:
x = set([1, 2, 3])
y = x
y |= set([4, 5, 6])
同じオブジェクトを指していますか、それとも新しいセットが作成されて割り当てられましたx
か?y
y
>>>> x = set([1, 2, 3])
>>>> y = x
>>>>
>>>> y |= set([4, 5, 6])
>>>> print x
set([1, 2, 3, 4, 5, 6])
>>>> print y
set([1, 2, 3, 4, 5, 6])
set1 = {1,2,3}
set2 = {1,2,[1,2]} --> unhashable type: 'list'
# Set elements should be immutable.
結論:セットは変更可能です。
あなたの2つの質問は異なります。
Pythonセットは変更可能ですか?
はい:「可変」とは、オブジェクトを変更できることを意味します。たとえば、整数は変更できません。数値1
を変更して他の意味にすることはできません。ただし、セットに要素を追加して、セットを変更することはできます。
y = x; y |= {1,2,3}
変化しx
ますか?
はい。このコードy = x
は、「名前をバインドして、その名前が現在表しy
ているのと同じオブジェクトを意味する」ことを意味します。x
このコードは、内部でy |= {1,2,3}
マジックメソッドy.__ior__({1,2,3})
を呼び出します。このメソッドは、名前で表されるオブジェクトを変更しますy
。これは、で表されるものと同じオブジェクトであるx
ため、セットが変更されることを期待する必要があります。
is
演算子を使用して、2つの名前が正確に同じオブジェクトを指しているかどうかを確認できます。名前でx is y
表されるオブジェクトが同じオブジェクトである場合に限ります。x
y
オブジェクトをコピーする場合、通常の構文はy = x.copy()
またはy = set(x)
です。ただし、これは浅いコピーにすぎません。設定されたオブジェクトをコピーしますが、そのオブジェクトのメンバーはコピーされません。ディープコピーが必要な場合は、を使用してcopy.deepcopy(x)
ください。
Pythonセットは2つのタイプに分類されます。可変および不変。'set'で作成されたセットは変更可能ですが、'frozenset'で作成されたセットは不変です。
>>> s = set(list('hello'))
>>> type(s)
<class 'set'>
次のメソッドは、可変セット用です。
s.add(item)-アイテムをsに追加します。list
がすでにsにある場合、効果はありません。
s.clear()-sからすべてのアイテムを削除します。
s.difference_update(t)-同じくtにあるsからすべてのアイテムを削除します。
s.discard(item)-sからアイテムを削除します。itemがsのメンバーでない場合、何も起こりません。
これらの操作はすべて、適切なセットを変更します。パラメータtは、反復をサポートする任意のオブジェクトにすることができます。
セットを変更した後、それらのオブジェクト参照も一致します。その教科書に集合が不変であると書かれている理由はわかりません。
>>> s1 ={1,2,3}
>>> id(s1)
140061513171016
>>> s1|={5,6,7}
>>> s1
{1, 2, 3, 5, 6, 7}
>>> id(s1)
140061513171016
print x,y
そして、両方が同じセットを指していることがわかります。
set([1, 2, 3, 4, 5, 6]) set([1, 2, 3, 4, 5, 6])
セットは可変です
s = {2,3,4,5,6}
type(s)
<class 'set'>
s.add(9)
s
{2, 3, 4, 5, 6, 9}
セットの要素を変更することができます
はい、Pythonセットは、要素をセットに追加、削除できるため変更可能ですが、セット自体に変更可能なアイテムを含めることはできません。以下のコードのようにエラーが発生します:
s = set([[1,2,3],[4,5,6]])
したがって、セットは変更可能ですが、変更可能なアイテムを含めることはできません。これは、セットが内部的にハッシュテーブルを使用して要素を格納するため、セット要素がハッシュ可能である必要があるためです。ただし、listなどの可変要素はハッシュできません。
注:可変要素はハッシュ
可能ではありません
不変要素はハッシュ可能です
辞書のキーがリストになることができないのと同じように。