W zdecydowanej większości przypadków
y *= <expr>
jest taka sama jak
y = y * <expr>
ale w ogólnym przypadku, jest interpretowany jako:
y = imul(y, <expr>)
która jest wtedy odpowiednikiem:
y = y.__imul__(<expr>)
, jeśli typ y
zastępuje __imul__
.
Oznacza to, że jeśli typ y
jest zastępuje mnożenia Ustalone, y*=<expr>
przeprowadza się Ustalone, a y=y*<expr>
nie.
EDIT
Może nie jest od razu jasne, dlaczego konieczne jest przypisanie, to dlaczego jest intrepreted jak y = imul(y, <expr>)
, a nie tylko imul(y, <expr>)
.
Powodem jest to, że to sprawia, że wiele sensu dla następujących dwóch scenariuszy dać ten sam wynik:
c = a * b
i
c = a
c *= b
Teraz, to oczywiście działa, jeśli a
i b
są tego samego typu (np. zmiennoprzecinkowe, numpy tablicowe itp.), ale jeśli nie są, możliwe jest, że wynik operacji ma typ b
, w którym to przypadku operacja nie może być lokalną operacją a
, więc wynik musi być przypisany do a
, aby uzyskać prawidłowe zachowanie.
Na przykład, to działa, dzięki Zadanie:
from numpy import arange
a = 2
a *= arange(3)
a
=> array([0, 2, 4])
natomiast jeśli przydział jest odrzucany, a
pozostaje niezmieniona:
a = 2
imul(a, arange(3))
=> array([0, 2, 4])
a
=> 2
Aby znaleźć odpowiednie dokumenty trzeba byłoby szukać * Zwiększone zadanie *. –
Ahh ok dzięki kolego. – BenniMcBeno