Greg Ewing firstname.lastname@example.org writes:
Michael Hudson email@example.com:
In particular what happens if the iteration variable is a local in the frame anyway? I presume that would inhibit the renaming
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!