Podobno kot pri spremenljivkah tabelaričnega tipa tudi spremenljivka tipa set
dejansko vsebuje zgolj kazalec na množico (njen pomnilniški naslov), ne pa množice same. V večini primerov se nam tega dejstva sicer ni treba zavedati (zato ponavadi govorimo kar o »množici a
«, ne pa – kar bi bilo pravilneje – o »množici, na katero kaže spremenljivka a
«), včasih pa nas lahko neprijetno preseneti. Oglejmo si primer (in ga izvedimo):
Čeprav smo sedmico dodali zgolj množici a
, se je »čudežno« pojavila tudi v množici c
. V resnici se pri prirejanju c = a
v spremenljivko c
skopira zgolj kazalec na množico, na katero kaže spremenljivka a
. Spremenljivki a
in c
torej kažeta na isto množico:
Če bi želeli ustvariti kopijo množice a
, bi morali uporabiti stavek c = a.copy()
.
Kakšna pa je razlika med stavkoma a = a.intersection(b)
in a.intersection_update(b)
, o kateri smo govorili? Stavek a = a.intersection(b)
izdela novo množico kot presek obeh množic in s spremenljivko a
pokaže nanjo. V našem primeru bi bilo to videti nekako takole:
Spremenljivki a
in c
sedaj ne kažeta več na isto množico!
Stavek a.intersection_update(b)
pa spremeni množico, na katero kaže spremenljivka a
. Takole:
Spremenljivki a
in c
še vedno kažeta na isto množico.
Seveda velja enako tudi za para funkcij union
in update
ter difference
in difference_update
.
Kaj se bo izpisalo po izvedbi spodnjih stavkov?
>>> a = {1, 2, 3, 4} >>> c = a >>> a.intersection_update({3, 4, 5}) >>> a = a.union({1}) >>> a ??? >>> c ???