[Python-Dev] Visibility scope for "for/while/if" statements
Alexander Myodov
maa_public at sinn.ru
Thu Sep 22 12:35:15 CEST 2005
Hello,
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
comprehension!
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:
pass
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