updating a variable / scope problem
Duncan Booth
me at privacy.net
Fri Jul 9 09:45:10 EDT 2004
"Robert Brewer" <fumanchu at amor.org> wrote in
news:mailman.142.1089323574.5135.python-list at python.org:
> Rajarshi Guha wrote:
>> I'm basically converting Bron and Kerbosch's
>> clique detection algorithm to python. The described algorithm is
> basically :
>>
>> def clique( .. ):
>> def extend( .. ):
>> ..
>> ..
>> if ( .. ) extend( .. )
>> ..
>> ..
>>
>> c = 0
>> ..
>> extend( .. )
>>
>> The variable c is accessed in the function extend().
>>
>> I suppose I could just make c and argument to extend as you mention -
>> though it seems a little less elegent than allowing extend() to have
>> access to c directly.
>
> If extend *modifies* c, then making it an argument to extend won't work;
> making it an argument makes a new binding for c, local to extend(), and
> won't modify c in clique(). The hack that used a list will work, but is
> still ugly. I'd suggest either rewriting the algorithm in register form
> (using a while loop) instead of recursive form, or (last resort) make c
> a global instead of a local within clique(). Does c get modified by
> clique()? If the answer is no, you might be able to rewrite extend() as
> a generator instead of a recursive function.
If extend *modifies* c, then it surely isn't too hard to do this:
def clique( .. ):
def extend(c, .. ):
..
..
if ( .. ) c = extend(c, .. )
..
..
return c
c = 0
..
c = extend(c, .. )
This way it is obvious that you are modifying c in the inner function.
Alternatively how about using a class?
More information about the Python-list
mailing list