[Python-Dev] recursive closures - reference cycle
Antoine Pitrou
solipsis at pitrou.net
Tue Dec 8 15:55:06 CET 2009
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.
More information about the Python-Dev
mailing list