Is there "let binding" in Python?

Jacek Generowicz jacek.generowicz at
Wed Sep 17 13:49:59 CEST 2003

Rob Hunter <rhunter007 at> writes:

> Is there an equivalent to Scheme's LET in Python?
>  LET creates a new binding in the current
> environment.  For example, here's some Scheme
> code:
> (let ((x 3))
>   (let ((f (lambda (arg) (* arg x))))
>     (let ((x 4))
>       (f 5))))
> So, this program, which also tests that Scheme
> has correct scoping, returns 15.

Sorry, never heard of "correct" scoping[*]. I've heard of lexical and
dynamic scoping though, and, to me, your code shows that Scheme has
lexical scoping.

> And in Python, I can write an equivalent program
> that does correctly return 15, but I have to use
> what, in Scheme, we call "left-left lambda"--a
> way of simulating LET.  Or rather, LET is
> syntactic sugar for left-left lambda.

A long, time ago (Python 2.0), Python only had 3 scopes: local, global
and builtin. Now it has nested scopes of arbitrary depth (still
wrapped inside global and builtin), but I'm not expecting "let" to
appear anytime soon.

[*] But given that you are formulating your question from a Scheme
    perspective, it's not really surprising that you call it
    "correct". :-)

More information about the Python-list mailing list