Evaluation in Iteration Functions

The builtin Wolfram Language iteration functions such as Table and Sum evaluate their arguments in a slightly special way.

When evaluating an expression like Table[f,{i,imax}], the first step, as discussed in "Blocks and Local Values", is to make the value of i local. Next, the limit imax in the iterator specification is evaluated. The expression f is maintained in an unevaluated form, but is repeatedly evaluated as a succession of values are assigned to i. When this is finished, the global value of i is restored.

The function RandomReal[] is evaluated four separate times here, so four different pseudorandom numbers are generated.
Click for copyable input
This evaluates RandomReal[] before feeding it to Table. The result is a list of four identical numbers.
Click for copyable input

In most cases, it is convenient for the function f in an expression like Table[f,{i,imax}] to be maintained in an unevaluated form until specific values have been assigned to Null. This is true in particular if a complete symbolic form for f valid for any i cannot be found.

This defines fac to give the factorial when it has an integer argument, and to give NaN (standing for "Not a Number") otherwise.
Click for copyable input
In this form, fac[i] is not evaluated until an explicit integer value has been assigned to i.
Click for copyable input
Using Evaluate forces fac[i] to be evaluated with i left as a symbolic object.
Click for copyable input

In cases where a complete symbolic form for f with arbitrary i in expressions such as Table[f,{i,imax}] can be found, it is often more efficient to compute this form first, and then feed it to Table. You can do this using Table[Evaluate[f],{i,imax}].

The Sum in this case is evaluated separately for each value of i.
Click for copyable input
It is however possible to get a symbolic formula for the sum, valid for any value of i.
Click for copyable input
By inserting Evaluate, you tell the Wolfram Language first to evaluate the sum symbolically, then to iterate over i.
Click for copyable input
Table[f,{i,imax}]keep f unevaluated until specific values are assigned to i
Table[Evaluate[f],{i,imax}]evaluate f first with i left symbolic

Evaluation in iteration functions.

Related Tutorials