[Python-Dev] Lexical scoping in Python 3k (original) (raw)

Andrew Koenig ark at acm.org
Mon Jul 3 17:08:18 CEST 2006


I don't think "trivial" is the right word to use here, since it implies something that's of so little importance that it can be ignored. But the simple cases are precisely the ones where this wart hurts the most, so we can't ignore them.

I'd like to inject an example that might help make this discussion more concrete.

Consider the following function:

def for_each(seq, f):
    for i in seq:
        f(i)

I'm sure I've seen more than one instance of someone on comp.lang.python trying to do the equivalent of using a function such as this one to compute the sum of the elements of a sequence as follows:

def sum(seq):
    result = 0
    def accum(i):
        result += i
    for_each(seq, accum)
    return result

and wonder why it doesn't work. Still odder, why it doesn't work and the following does:

def sum(seq):
    result = [0]
    def accum(i):
        result[0] += i
    for_each(seq, accum)
    return result[0]

Transforming the first definition of sum above into the second may be trivial, but only if you've encountered the technique before. Moreover, the first version of sum uses a technique that is more than 45 years old (!), as it was available to Algol 60 programmers.



More information about the Python-Dev mailing list