静かなる名辞

pythonとプログラミングのこと


【python】pythonのsetは値比較なのか?

 ふと思った。「pythonのsetって値比較してるの?」

>>> a = ("hoge",) #同値かつ同一でないimmutableの作り方がタプル以外思いつかなかった
>>> b = ("hoge",)
>>> a is b
False
>>> id(a)
140412431555272
>>> id(b)
140412430884312
>>> set([a,b])
{('hoge',)}

 してるらしい。このsetの中身はどっちのオブジェクトなんだろう。

>>> id(list(set([a,b]))[0])
140412431555272

 先に書いた方? 数を3つにして試してみる。

>>> a = ("hoge",)
>>> b = ("hoge",)
>>> c = ("hoge",)
>>> id(a)
140412431554880
>>> id(b)
140412431555272
>>> id(c)
140412430884312
>>> id(list(set([a,b,c]))[0])
140412431554880
>>> id(list(set([b,c,a]))[0])
140412431555272
>>> id(list(set([c,a,b]))[0])
140412430884312

 やっぱり「先に出現したオブジェクトのid」という規則性があるような気もするけど、言語仕様で決まってる訳ではないので、これを利用してプログラムを書こうとか考えない方が良いだろう。

 まあ、それ以前に使い道もないけど。