Recursive method in class

Terry Reedy tjreedy at udel.edu
Tue Oct 1 07:45:44 EDT 2019


On 10/1/2019 3:37 AM, ast wrote:
> The following code is working well and I don't really understand why
>> def factorial(self, n):
>     if not n:
>         return 1
>     else:
>         return n * factorial(self, n - 1)

This creates a function that looks up 'factorial' in the global (module) 
scope when called.
> Dummy = type("DummyObject", (object, ), {"factorial" : factorial})

This creates a reference to the function in the class dict. There is 
now one function object with 2 references.
> instance = Dummy()
> instance.factorial(3)

instance.factorial still looks up 'factorial' in the global scope, and 
finds it there. If you delete the global reference after creating the 
class, the lookup will fail, as when
>> 6  # correct

> The problem is that "factorial" in line
> "return n * factorial(self, n - 1)" should not have been found
> because there is no factorial function defined in the current
> scope.

Yes there is. the 'current' scope always includes globals, and globals 
has a reference to the function.
-- 
Terry Jan Reedy


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /