Overriding a global
Chris Angelico
rosuav at gmail.com
Wed Dec 14 07:21:29 EST 2011
On Wed, Dec 14, 2011 at 11:05 PM, Jean-Michel Pichavant
<jeanmichel at sequans.com> wrote:
> Chris Angelico wrote:
>>
>> So... it's a bad idea for me to use 'i' many times in my code, with
>> the same name having different meanings in different places? In
>> languages with infinitely-nesting scopes...
> Bad ideas :
>
> i = 5
>
> def spam():
> for i,v in enumerate([1,2,3,4]):
> for i,v in enumerate(['a','b', 'c']):
> print i, v
> print i,v # bad surprise
That's my point. It's not safe to do it in Python, because the "inner"
local i is the same as the "outer" local i. Python doesn't have block
scope the way most C-like languages do.
int spam()
{
for (int i=0;i<5;++i)
{
for (int i=2;i<4;++i) write("inner "+i+"\n");
write("outer "+i+"\n");
}
}
Works perfectly, and the only cost is that variables must be formally declared.
In Python, you can kinda fudge that sort of thing with nested functions.
def spam():
q=2 # just to prove that the scopes really are nested
for i in range(5):
def ham():
for i in range(2,4):
print("q = %d, i = %d"%(q,i))
ham()
print("i = %d"%i)
It's somewhat clunky, but it does give the illusion of block scope.
Inners mask outers, outers are visible to inner functions. It's an odd
construct though. Very odd.
So... I think I've figured out how to implement from __future__ import braces.
#define { def innerfunc():
#define } innerfunc()
And there you are, out of your difficulty at once!
ChrisA
More information about the Python-list
mailing list