Why does 1**2**3**4**5 raise a MemoryError?

Dave Angel davea at davea.name
Sun Mar 31 18:34:05 EDT 2013


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



More information about the Python-list mailing list