38

Pythonのセットは変更可能ですか?


言い換えれば、私がこれを行う場合:

x = set([1, 2, 3])
y = x

y |= set([4, 5, 6])

同じオブジェクトを指していますか、それとも新しいセットが作成されて割り当てられましたxか?yy

4

8 に答える 8

54
>>>> 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.

結論:セットは変更可能です。

于 2013-01-07T09:53:46.160 に答える
22

あなたの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表されるオブジェクトが同じオブジェクトである場合に限ります。xy

オブジェクトをコピーする場合、通常の構文はy = x.copy()またはy = set(x)です。ただし、これは浅いコピーにすぎません。設定されたオブジェクトをコピーしますが、そのオブジェクトのメンバーはコピーされません。ディープコピーが必要な場合は、を使用してcopy.deepcopy(x)ください。

于 2013-01-07T10:00:44.990 に答える
11

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は、反復をサポートする任意のオブジェクトにすることができます。

于 2018-07-27T15:01:40.390 に答える
3

セットを変更した後、それらのオブジェクト参照も一致します。その教科書に集合が不変であると書かれている理由はわかりません。

    >>> s1 ={1,2,3}
    >>> id(s1)
    140061513171016
    >>> s1|={5,6,7}
    >>> s1
    {1, 2, 3, 5, 6, 7}
    >>> id(s1)
    140061513171016
于 2018-02-07T08:32:07.367 に答える
2
print x,y

そして、両方が同じセットを指していることがわかります。

set([1, 2, 3, 4, 5, 6]) set([1, 2, 3, 4, 5, 6])
于 2013-01-07T09:53:25.467 に答える
1

セットは可変です

s = {2,3,4,5,6}
type(s)
<class 'set'>
s.add(9)
s
{2, 3, 4, 5, 6, 9}

セットの要素を変更することができます

于 2019-07-11T10:55:18.487 に答える
1

はい、Pythonセットは、要素をセットに追加、削除できるため変更可能ですが、セット自体に変更可能なアイテムを含めることはできません。以下のコードのようにエラーが発生します:

s = set([[1,2,3],[4,5,6]])

したがって、セットは変更可能ですが、変更可能なアイテムを含めることはできません。これは、セットが内部的にハッシュテーブルを使用して要素を格納するため、セット要素がハッシュ可能である必要があるためです。ただし、listなどの可変要素はハッシュできません。

注:可変要素はハッシュ
可能ではありません
不変要素はハッシュ可能です

辞書のキーがリストになることができないのと同じように。

于 2019-08-14T12:30:10.397 に答える
-3

著書「 LearningPython5thEdition by Mark Lutz-O'Reilly Publications」で明確に述べられているように、Pythonセットは変更可能ではないと思います。

ここに画像の説明を入力してください

于 2017-12-25T07:13:21.413 に答える