2016-04-16 4 views
5

Warum ändert sich diese Einstellung s? Es funktioniert nicht die gleiche Art und Weise für die ganze Zahl (bitweise) Version des gleichen Betreibers ....Warum setzt Python "& =" Operator anders als "& =" Integer-Operation?

Set Betrieb &= (ändert s):

s = set('abc') 
t = set('bcd') 
u=s 
print u, s, t 
u &= t 
print u, s, t 

Ergebnisse:

set(['a', 'c', 'b']) set(['a', 'c', 'b']) set(['c', 'b', 'd']) 

set(['c', 'b']) set(['c', 'b']) set(['c', 'b', 'd']) 

Bitweiser Betrieb &= (ändert sich nicht s):

s = 7 
t = 3 
u=s 
print u, s, t 
u &= t 
print u, s, t 

Ergebnis:

7 7 3 

3 7 3 
+7

Sätze sind veränderbar und ganze Zahlen nicht. Probieren Sie es mit einem 'Frozenset'. – jonrsharpe

+0

Es funktioniert wie erwartet mit frozensets. Daher versucht die Operation nicht, die Menge u (dasselbe Objekt wie s am Anfang der Anweisung) direkt zu ändern oder eine Ausnahme verursacht zu haben. Was versucht es zu tun? –

+0

Listen zeigen dasselbe Verhalten wie Sets für & =. Tupel verursachen einen TypeError. –

Antwort

5

Integers die & Betrieb implementieren, aber nicht den &= Betrieb, also wenn Sie x &= y verwenden, um es x = x & y erweitert wird, die einfach die x Variable eher neu zuweist als seinen internen Zustand zu modifizieren (es nicht machen würde viel Sinn für &, um einen Wert zu mutieren, so wie es für + nicht sinnvoll wäre). Gleiches gilt für frozensets.

Sets implementieren die &= Operation, so dass es nicht auf eine variable Neuzuweisung erweitert wird, sondern die linke Seite des Operators mutiert.

Tuples implementieren weder & noch &= so macht ein Fehler Sinn. Allerdings erhalten Sie den gleichen Effekt mit +=: für Tupel += ist erweitert, für Listen ist es eine In-Place-Mutation, weil Listen veränderbar sind.

Jede Klasse kann ihre eigene Version dieser Operatoren implementieren. Details siehe here. Insbesondere entspricht &__and__ und &= bis __iand__.

Wenn Sie darüber nachdenken, ist es eine sinnvolle Konvention für veränderbare Klassen, die In-Place-Operatoren zu implementieren, um direkte Modifikationen zu ermöglichen, aber nicht unveränderbare Klassen.

+0

Danke. Sie haben mir genügend Informationen gegeben, um "Augmented Assignment", PEP-203, und meine Antwort in der Python 2.7.11 Dokumentation unter https://docs.python.org/2/reference/simple_stmts.html zu finden. –

Verwandte Themen