On 03/31/2013 06:06 PM, Alex wrote:
Dave Angel wrote:

On 03/31/2013 02:56 AM, morphex wrote:
1**2
1
1**2**3
1
1**2**3**4
1L
1**2**3**4**5
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
MemoryError


Does anyone know why this raises a MemoryError?  Doesn't make sense
to me.

Perhaps you didn't realize that the expression will be done from
right to left.

Really?

The Python 3 documentation
(http://docs.python.org/3/reference/expressions.html) says in section
6.14 (Evaluation order) that "Python evaluates expressions from left to
right" (an exception being when evaluating assignments, in which case
the RHS of the assignment is calculated first, in left-to-right order).

Section 6.4 discusses the power operator specifically and does not
contradict 6.14 except that the power operator uses right-to-left
evaluation in the presence of unparenthesized unary operators.

Neither of these two exception cases appear to apply here, so I think
the OP is reasonable in expecting Python to do the operation
left-to-right.

Am I missing something written somewhere else in the docs? Are the docs
I quoted wrong? Please help me understand the discrepancy I am
perceiving here.

Alex


On the page you reference, in section 6.14, see the 4th entry:

expr1 + expr2 * (expr3 - expr4)

expr1 is evaluated before expr2, but the multiply happens before the add.

Now see the following paragraph (6.15):

"""
The following table summarizes the operator precedences in Python, from lowest precedence (least binding) to highest precedence (most binding). Operators in the same box have the same precedence. Unless the syntax is explicitly given, operators are binary. Operators in the same box group left to right (except for comparisons, including tests, which all have the same precedence and chain from left to right — see section Comparisons — and exponentiation, which groups from right to left).
"""

What this paragraph refers to as "grouping" is commonly called associativity in other languages.

There are three different concepts here that apply whenever an expression has more than one term:

1) evaluation order is important for terms lie function calls which have side effects
2) precedence, lie where multiply will happen before add
3) associativity, where the order of operations for operators with the same precedence are done either left to right (usually), or right to left (like exponentiation)




--
DaveA
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to