[Python-Dev] Visibility scope for "for/while/if" statements

Alexander Myodov maa_public at sinn.ru
Thu Sep 22 12:35:15 CEST 2005


 Don't want to be importunate annoyingly asking the things probably
 trivial for experienced community, but need to ask it anyway, after
 spending about two hours trying to find well-camouflaged error caused
 by it. 

 Why the variables defined inside "for"/"while"/"if" statements
 (including loop variables for "for") are visible outside this scope?
 This litters the namespace, makes things more complex and requires
 even more attention from the programmer than even the uneasy C. Or
 makes him to watch for using each variable only once (prohibiting
 from using usual i/j/k variables); otherwise copypasting a piece of
 code can cause hardly-findable errors.
 But not even the variables from inside of statements are forgot in
 the outside namespace; what is most ridiculous is that the inner
 variables from a list comprehension are kept outside the

 Yes, I am aware of one use case for this... er, feature.
 It could be useful to remember the last item of the loop after the loop
 is done... sometimes. But what is it for in other cases, except
 confusing the programmer?

 Or maybe can someone hint me whether I can somehow switch the behaviour on
 source-level to avoid keeping the variables outside the statements?
 Something like Perlish "import strict"? I couldn't find it myself.
 While global change of Python to the variables local to statements and
 list comprehension could definitely affect too much programs, adding
 it on a per-source level would keep the compatibility while making
 the life of Python programmers safer.
 Thanks in advance.

 Appendix 1: examples.
--------cut here--------

#!/usr/bin/env python -t

a1 = ['a', 'b', 'c', 'd', 'e']

# Loop variable is alive outside the loop
for k in a1:
print "k: %s" % k

# Loop variable is alive even outside the list comprehension!
b1 = [l for l in a1]
print "l: %s" % l

# If there are several loops in a comprehension, 
# variables from all of them are kept intact
c1 = [(m, n) for m in a1 for n in b1]
print "m: %s, n: %s" % (m, n)

# Loop variable is kept even from nested comprehensions
d1 = [o for o in [p for p in a1]]
print "o: %s, p: %s" % (o, p)

# And the winner is...
for r in a1:
        print "r0: %s, " % r, 
        e1 = [r for r in b1]
        # Now try to access the "r" variable from the loop!
        print "r1: %s" % r

--------cut here--------

With best regards,
 Alexander                          mailto:maa_public at sinn.ru

More information about the Python-Dev mailing list