Unterschied zwischen union () und union_update () in Mengen und anderen?

7

Python-Sets haben folgende Methoden:

%Vor%

Ebenso gibt es auch diese:

%Vor%

Und so weiter, für alle üblichen relationalen Algebra-Operationen.

Also ... Frage ist, was genau ist der Unterschied hier? Ich sehe, dass es sagt, dass die update () Versionen s anstelle eines neuen Satzes zurückgibt, aber wenn ich x = s.update(t) schreibe, bedeutet das, dass id(x) == id(s) ? Beziehen sie sich jetzt auf dasselbe Objekt?

Ich meine, ich verstehe nicht wirklich, warum beide Methoden implementiert sind. Es scheint keine signifikante Funktionalität hinzuzufügen.

    
Aerovistae 16.12.2012, 21:27
quelle

3 Antworten

17

Sie sind sehr anders. Ein Satz ändert den Satz an Ort und Stelle , während der andere den ursprünglichen Satz allein belässt und stattdessen eine Kopie zurückgibt.

%Vor%

Beachten Sie, wie s unverändert geblieben ist.

%Vor%

Jetzt habe ich s selbst geändert. Beachten Sie auch, dass .update() anscheinend nichts zurückgegeben hat. Es gab s nicht an den Aufrufer zurück, und der Python-Interpreter gab keinen Wert zurück.

Methoden, die Objekte an Ort und Stelle ändern, geben das Original nie in Python zurück. Ihr Rückgabewert ist immer None (was niemals widergegeben wird).

    
Martijn Pieters 16.12.2012, 21:29
quelle
2

Die _update -Methoden modifizieren die Menge direkt und geben None zurück. Die Methoden ohne update geben ein neues Objekt zurück. Du willst höchstwahrscheinlich nicht x = s.update(t) machen, da dies x auf None setzt.

%Vor%

Die von den _update -Methoden hinzugefügte Funktionalität besteht in der Fähigkeit, vorhandene Mengen zu ändern. Wenn Sie einen Satz für mehrere Objekte freigeben, möchten Sie möglicherweise den vorhandenen Satz ändern, damit die anderen Objekte, die ihn freigeben, die Änderungen sehen. Wenn Sie nur einen neuen Satz erstellen, wissen die anderen Objekte nichts darüber.

    
BrenBarn 16.12.2012 21:30
quelle
1

Es sieht so aus, als würden die Dokumente nicht so eindeutig wie möglich angegeben, aber set.update gibt gar nichts zurück (was der Rückgabe von None entspricht) %Code%. Wie set.intersection_update oder list.append oder list.extend ändern sie den Container an Ort und Stelle.

%Vor%

Bearbeiten: die Dokumente sagen nicht was Sie zeigen in der Frage. Sie sagen:

  

Aktualisiere die Menge und füge Elemente aus allen anderen hinzu.

und

  

Aktualisiere die Menge und behalte nur die darin enthaltenen Elemente und alle anderen.

    
Lev Levitsky 16.12.2012 21:33
quelle

Tags und Links