Spójrz na to:Dlaczego te dwie funkcje są różne?
>>> def f():
... return (2+3)*4
...
>>> dis(f)
2 0 LOAD_CONST 5 (20)
3 RETURN_VALUE
Najwyraźniej kompilator został wstępnie oceniony (2+3)*4
, które ma sens.
Teraz, jeśli po prostu zmienić kolejność argumentów o *
:
>>> def f():
... return 4*(2+3)
...
>>> dis(f)
2 0 LOAD_CONST 1 (4)
3 LOAD_CONST 4 (5)
6 BINARY_MULTIPLY
7 RETURN_VALUE
Wyrażenie nie jest już w pełni wstępnie ocenione! Jaki jest tego powód? Używam CPython 2.7.3.
Wygląda jak usterka w optymalizatorze wizjera. Możesz sprawdzić moduł do śledzenia błędów i sprawdzić, czy jest to znany problem. – user2357112
Przestań używać starego python 2.x ... Na 3.3 (przynajmniej) działa tak, jak powinien. – JBernardo
@JBernardo 2.x i 3.x są bardzo różne; Nie mogę płynnie przełączać się między nimi. – arshajii