2013-05-22 18 views
6

Idę przez niektórych działań Python i dano przykładowy kod z tego operatora: y *= -1Co to jest operator * = -1

miałem wygląd poprzez relevant Python docs, bezskutecznie.

Wiem, że na przykład y += 1 jest skrót od y = y + 1. Czy to jest y = y * -1 y równa się y razy -1?

najbliższą rzeczą w Python docs udało mi się znaleźć to: x * y: produktem xiy

Czy to prawda?

+3

Aby znaleźć odpowiednie dokumenty trzeba byłoby szukać * Zwiększone zadanie *. –

+0

Ahh ok dzięki kolego. – BenniMcBeno

Odpowiedz

12

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 
+0

Czy możesz wyjaśnić, dlaczego jest interpretowane jako' y = y .__ imul __ () 'a nie tylko' y .__ imul __ () '? – wim

+0

Zobacz [docs] (http://docs.python.org/3.3/reference/datamodel.html#object.__iadd__): "Te metody powinny próbować wykonać operację w miejscu (modyfikując self) i zwrócić wynik (które może być, ale nie musi być, samo). " – shx2

+2

@wim jest wtedy osławiony przypadek modyfikacji krotki 'x = ([],)', 'x [0] + = ['a']' 'x' – jamylak

3

Tak, zgadza się. Oznacza to tylko pomnożenie wartości lewej ręki przez ujemną wartość prawą ręką. Są to zarówno operatory arytmetyczne, które różnią się po prostu operacją i powiązaniem wyrażenia, więc uważam, że +/* są równoległe wszędzie, gdzie występują przeciążenia.

y = y * -1 
+3

To nie jest w 100% identyczne, jeśli "y" ma skutki uboczne przy ocenie (takie jak drukowanie lub modyfikowanie stanu). W 'y * = -1',' y' jest oceniany jeden raz. W "y = y * -1", "y" jest oceniane dwukrotnie. – Patashu

+0

Masz na myśli sekundę ocenianą od równego operatora? Nvm, powiedziałeś, że zmieniasz stan. Jest to bardziej oczywiste, gdy mamy do czynienia z przedmiotami: 'k [klucz] * = -1' – chaz