On 17.10.2016 16:45, chenyong20...@gmail.com wrote:
thanks for your kind reply. I try to explain what I got from your reply:
for code1, when running "foo = outer()", since outer() is callable, function outer() is running and it
returns an object, which referring to function inner(). When "foo" is running, it indicates it is referring
to object inner(). When "foo()" is running, object inner() is called, so it prints "inside inner".
for code2, when running "foo = outer()", since outer() is callable, function outer() is running and returns
results from function inner(), which prints "inside inner". so "foo" now is a string, which
contains "inside inner". since this string isn't a function, foo() will make an error.
Do you think my understanding is right? thanks.
Not quite. Your understanding of code 1 is correct.
In your example code 2, however:
> ----------------code 2-------------------------------
> >>> def outer():
> ... def inner():
> ... print 'inside inner'
> ... return inner()
> >>> foo = outer()
> inside inner
> >>> foo
> >>> foo()
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> TypeError: 'NoneType' object is not callable
calling outer returns the result of inner, as you are saying, but that
result is *not* the string 'inside inner', but None (implicitly
returned). As I explained before, the printed string is a side-effect of
the function inner, but it is *not* what that function returns.
foo = outer()
*prints* the string 'inside inner', but sets foo to refer to None.
That's why the following TypeError mentions NoneType.