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


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


Regards

Antoine.


_______________________________________________
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