> -----Original Message-----
> From: python-dev-bounces+kristjan=ccpgames....@python.org
> [mailto:python-dev-bounces+kristjan=ccpgames....@python.org] On Behalf
> Of Antoine Pitrou
> Sent: 8. desember 2009 14:55
> To: python-dev@python.org
> Subject: Re: [Python-Dev] recursive closures - reference cycle
> 
> Kristján Valur Jónsson <kristjan <at> ccpgames.com> writes:
> >
> > The problem with this is that once you have called
> > factorial() once, you end up with a recursive cycle.
> 
> You don't need a closure to exhibit a reference cycle. A global
> function is
> enough:
> 
> >>> def helper(n):
> ...  if n:
> ...   return n*helper(n-1)
> ...  else:
> ...   return 1
> ...
> >>> helper.func_globals['helper'] is helper
> True
> 
yes, because:
func_globals is globals() == True

You don't need recursion for this to be true.  And as soon as you delete 
"helper" from globals() it goes away.
w = wearref.weakref(helper)
del helper
w() == False.

> 
> If you really want to avoid this you can prevent the function from
> depending
> on its outside environment:
> 
> >>> from functools import partial
> >>> def helper2(rec, n):
> ...  if n:
> ...   return n*rec(rec, n-1)
> ...  else:
> ...   return 1
> ...
> >>> factorial = partial(helper2, helper2)
> >>> "helper2" in factorial.func.func_globals
> True
> >>> del helper2
> >>> "helper2" in factorial.func.func_globals
> False
> >>> factorial(3)
> 6

Interesting, pass itself in as an argument.
Yes, there are ways around this, I know.  But you have to agree that it is 
unexpected, no?
Somethign for the "reference cycle FAQ."

Anyway, I´ll return to my lair now, thanks for your time python-dev :)

K
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to