[Tutor] function local var problem :-((

mjekl at clix.pt mjekl at clix.pt
Sun Oct 5 17:57:32 EDT 2003


Thank you all for the clear explanations.

I checked-out the link supplied by Lloyd Kvam. Many Txs Lloyd for the
suberb explanation and on-the-spot great link!


Hi Gregor,

Your right about everything, except that:

>>> printHierarchy(oSub2, []) # is a sintax error

Best Regards,
Miguel

> Hi Miguel,
> 
> you ran into a well known pitfall, which you can observe
> in a very simple case here:
> 
>  >>> def test(l=[]):
>     l.append(1)
>     print l
>  
>  >>> test()
> [1]
>  >>> for i in range(3):
>     test()
>   
> [1, 1]
> [1, 1, 1]
> [1, 1, 1, 1]
> 
> it occurs if you use an object as default argument
> which is *mutable*, for instance a list.
> 
> then l points to an object, which is created
> only when the function is *defined*, notwhen it
> is called.
> 
> As long as there is no new assignment to l, this object
> is retained  and can be changed if it's mutable.
> This is done in your	example  and in the one above.
> Every new function call uses the actual state of l.
> 
> Remark: As far as I see you could solve your problem
> by deleting the defaultargument in the definition and then
> call
> 
>  >>> printHierarchy(oSub2, [])
> 
> Hope that helps,
> Gregor
> 
> 
> mjekl at clix.pt schrieb:
> 
> >Hi,
> >
> >I'm new here and with programming. I've been learning on my own and
cannot
> >understand what happens with this function I created.
> >
> >The function is in it's own module that I import into shell.
> >
> >###### module1.py ######
> >
> >def printHierarchy(objecto, printList=[]):
> >   """Prints a class hierarchy given an object.
> >	 Works only with single inheritance hierarchies."""
> >
> >   if objecto.__class__.__bases__:
> >	 printList.append(objecto.__class__.__name__)
> >	 recurObjecto = objecto.__class__.__bases__[0]()
> >	 return printHierarchy(recurObjecto, printList)
> >   else:
> >	 printList.append(objecto.__class__.__name__)
> >
> >	 if not objecto.__class__.__bases__:
> >	 i = 0
> >	 for klass in printList:
> >	    print i * ' ' + klass
> >	    i += 1
> >	 else:
> >	 return printList
> >
> >####################
> >
> >in shell I created a hierarchy of three classes:
> >class Sup; class Sub1(Sup); class Sub2(Sub1)
> >
> >Then:
> >  
> >
> >>>>oSub2 = Sub2()
> >>>>printHierarchy(oSub2)
> >>>>	      
> >>>>
> >Sup
> >   Sub1
> >	 Sub2
> >  
> >
> >
> >The problem is that if I call the function again I get:
> >  
> >
> >>>>printHierarchy(oSub2)
> >>>>	      
> >>>>
> >Sup
> >   Sub1
> >	 Sub2
> >	 Sup
> >	    Sub1
> >	       Sub2
> >  
> >
> >
> >The problem to me is that I think that the var printList is local and
that
> >it is initialized every time the function is called. But results
contradict
> >this assumption. So I tried to investigate the namespaces and found no
> >references to var printList. I guess my investigation is bad (In shell I

> >issued dir() and dir(module1)
> >and got nothing. Also tried to use:
> > from module1 import printHierarchy
> >But didn't work either. Can someone please help me?
> >
> >Python 2.2 winXP
> >
> >Txs,
> >Miguel
> >
> >Clix Rapidix - Aumente até 6X a velocidade da sua Internet
> >Adira em http://acesso.clix.pt e comece logo a navegar
> >
> >_______________________________________________
> >Tutor maillist  -  Tutor at python.org
> >http://mail.python.org/mailman/listinfo/tutor
> >
> >
> >  
> >
> 


Clix Rapidix - Aumente até 6X a velocidade da sua Internet
Adira em http://acesso.clix.pt e comece logo a navegar



More information about the Tutor mailing list