Martin Miller wrote: > Well, perhaps the same in the sense of name binding, but there's a > subtle difference in replacing the 's = [n]' with 'foo.s = n'. Namely > that in the former case (with the essay's original code) a separate > container is created when foo() is first called and is what is used in > subsequent calls to the function returned. Whereas in the latter case > where the foo object itself is used as the container, there's only a > single container used by all returned objects -- which would cause > problems if you try accumulating two or more different totals > simultaneously.
[snip example using the outer foo() as a container] You can easily get a unique container using the function attribute style, to -- just use the inner function bar(): >>> def foo(n): ... def bar(i): ... bar.i += 1 ... re ... >>> >>> def foo(n): ... def bar(i): ... bar.s += i ... return bar.s ... bar.s = n ... return bar ... >>> a1 = foo(0) >>> a2 = foo(0) >>> a1(0), a2(0) (0, 0) >>> a1(1), a2(1) (1, 1) Peter -- http://mail.python.org/mailman/listinfo/python-list