
Greg Ewing <greg@cosc.canterbury.ac.nz> writes:
Michael Hudson <mwh@python.net>:
In particular what happens if the iteration variable is a local in the frame anyway? I presume that would inhibit the renaming
Why?
Well, because then you have the same name for two different bindings.
but then code like
def f(x): r = [x+1 for x in range(x)] return r, x
becomes even more incomprehensible (and changes in behaviour).
Anyone who writes code like that *deserves* to have the behaviour changed on them!
This was not my impression of the Python way. I know I'd be pretty pissed if this broke my app. I have no objection to breaking the above code, just to breaking it silently! Having code *silently change in behaviour* (not die with an expection, post a warning at compile time or fail to compile at all) is about an evil a change as it's possible to contemplate, IMO.
If this is really a worry, an alternative would be to simply forbid using a name for the loop variable that's used for anything else outside the loop. That could break existing code too, but at least it would break it in a very obvious way by making it fail to compile.
This would be infinitely preferable! Cheers, mwh -- I like silliness in a MP skit, but not in my APIs. :-) -- Guido van Rossum, python-dev