2016-04-16 15 views
5

Dlaczego ta ustawiona zmiana operacji została ustawiona na s? To nie działa w ten sam sposób za całkowitą (bitowe) wersji tego samego operatora ....Dlaczego operator setu "& =" Pythona działa inaczej niż operacja typu "+ ="?

Set Operacja &= (zmienia s):

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

Wyniki:

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

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

Bitowa operacja &= (nie zmienia się s):

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

Wynik:

7 7 3 

3 7 3 
+7

Zestawy są zmienne, a liczby całkowite nie są. Spróbuj z 'zamrożonym zestawem'. – jonrsharpe

+0

Działa zgodnie z oczekiwaniami z frozensets. Tak więc operacja nie próbuje zmodyfikować zestawu u (ten sam obiekt, co s na początku instrukcji) w miejscu lub spowodowałby wyjątek. Co próbuje zrobić? –

+0

Listy przedstawiają to samo zachowanie, co zestawy dla & =. Krotki powodują TypeError. –

Odpowiedz

5

Integers realizować operację & ale nie działanie &=, więc podczas korzystania x &= y jest rozszerzony do x = x & y który po prostu zmienia przypisanie x zmiennej zamiast modyfikowania jego stan wewnętrzny (nie uczyniłoby dużo sensu dla &, aby zmutować wartość, tak jak nie ma to sensu dla +). To samo dotyczy frozensets.

Zestawy wykonują operację &=, więc nie są rozszerzane na zmienne przypisanie, lecz mutują lewą stronę operatora.

Krotki implementują ani & ani &=, więc błąd ma sens. Jednak uzyskuje się ten sam efekt z +=: dla krotek += jest rozszerzony, dla list jest mutacją na miejscu, ponieważ listy są zmienne.

Każda klasa może wdrożyć własną wersję tych operatorów. Aby uzyskać szczegółowe informacje, patrz here. W szczególności & odpowiada __and__ i &= na __iand__.

Jeśli o tym pomyślisz, jest to rozsądna konwencja dla klas zmiennych w celu zaimplementowania operatorów w miejscu w celu umożliwienia bezpośredniej modyfikacji, ale nie niezmiennych klas.

+0

Dzięki. Dałeś mi wystarczająco dużo informacji, aby znaleźć "Rozszerzone Przypisanie", PEP-203, i, moja odpowiedź, w dokumentacji Pythona 2.7.11 na https://docs.python.org/2/reference/simple_stmts.html. –

Powiązane problemy