Unterschied zwischen union() und union_update() in Gruppen und andere?
Python-Sätze haben diese Methoden:
s.union(t) s | t new set with elements from both s and t
s.update(t) s |= t return set s with elements added from t
Ebenso gibt es auch diese:
s.intersection_update(t) s &= t return set s keeping only elements also found in t
s.intersection(t) s & t new set with elements common to s and t
Und so weiter, für alle standard-relationale-algebra-Operationen.
So...die Frage ist, was genau ist hier der Unterschied? Ich sehe, dass er sagt, dass die update () - Versionen gibt s statt einen neuen Satz, aber wenn ich Schreibe x = s.update(t)
ist, dass bedeutet, dass id(x) == id(s)
? Sie sind Referenzen auf das gleiche Objekt nun?
Ich meine, ich don ' T wirklich sehen, warum beide Sätze von Methoden implementiert. Es scheint nicht hinzufügen keine signifikante Funktionalität.
- Bah, ich war das Lesen veralteter Dokumentation von Unfall.
- Wo war das? 2.7.3 sets-Dokumentation nicht die Sprache, die Sie zitieren.
- docs.python.org/2/library/sets.html - was ist, was kommt, wenn Sie google "python-sets", leider.
- Ah, Sie fand die alte
sets
- Modul; dieset
built-in-Typ wurde später Hinzugefügt werden, ersetzen Sie das Modul. Oben heißt es Veraltet seit version 2.6: Der built-in-set/frozenset-Typen ersetzen Sie das Modul. - Wie ich heute gelernt.
- Die Dokumentation für dieses Modul ist eigentlich auch falsch. Ich habe in der Quellcode und die
*_update()
Methoden zurück, Keines zu.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie sehr anders. Ein set ändert die set - im Ort, während die anderen Blätter die ursprüngliche Menge alleine, und gibt ein kopieren statt.
Hinweis, wie
s
unverändert geblieben.Nun, ich habe mich verändert
s
selbst. Beachten Sie auch, dass.update()
erscheinen nicht zu etwas zurückkehren; es kam nicht zurücks
dem Anrufer und der Python-interpreter nicht echo einen Wert.Methoden, die Objekte ändern, die in-place-nie wieder das original in Python. Ihr Rückgabewert ist immer
None
statt (das ist nie echo).s1.update(s2)
entsprichts1|=s2
. Ich Frage mich, ob es irgendwelche performance-Unterschied zwischen den beiden.timeit
Prozess; es ist nicht viel Unterschied;s1|=s2
ist geringfügig langsamer (etwa 1-2% so). Berücksichtigen Sie, dass die augmented -|=
Zuordnung nicht wirklich zuordnen zurücks1
auch wenn das Objekt wurde erstmals aktualisiert im Ort (was Konsequenzen haben kann, wenn der Ziel-name war eine Klasse erste Attribut oder ein element von einem unveränderlichen Objekt).Den
_update
Methoden zum ändern der in-place und Rückkehr Keine. Die Methoden ohneupdate
Gegenzug ein neues Objekt. Sie fast sicher nicht wollen, zu tunx = s.update(t)
, da diex
auf Keine.Die Funktionalität Hinzugefügt, indem die
_update
Methoden ist die Möglichkeit zum ändern von vorhandenen sets. Wenn Sie die Freigabe einer Reihe zwischen mehreren Objekten, möchten Sie vielleicht ändern Sie die vorhandene gesetzt, so dass die anderen Objekte zu teilen, sehen Sie die änderungen. Wenn Sie erstellen Sie einfach einen neuen Satz, die anderen Objekte nicht zu kennen.Sieht es aus wie die docs nicht Zustand, den es in der klarste Weg möglich, aber
set.update
nicht zurück überhaupt nichts (was gleichbedeutend ist mit der RückkehrNone
), auch nichtset.intersection_update
. Wielist.append
oderlist.extend
oderdict.update
Sie ändern die container im Ort.Edit: eigentlich die docs nicht sagen, was Sie zeigen, in Frage. Sie sagen:
und