python执行嵌套函数

时间:2014-07-16 23:31:28

标签: python function closures

我有这段代码,我对它的执行感到困惑:

 def makeInc(x):
     def inc(y):
         return y + x
     return inc

 inc5 = makeInc(5)
 # print inc5 --->  <function inc at 0xb721bdbc>
 inc5(12)
 # print inc5(12) gives 17

所以,我想知道为什么它只在函数x+y的第二次调用中得到总和inc5()。 我知道python中的闭包真的意味着什么,但我仍然感到困惑。

我在这个网页上找到了这段代码: http://ynniv.com/blog/2007/08/closures-in-python.html

2 个答案:

答案 0 :(得分:3)

以下是对正在发生的事情的评论。

makeInc是一个函数,它返回另一个函数。使用闭包,返回的函数知道 约x被设置为值,因为它在创建和返回时是真实的。

首先调用inc2 = makeInc(5)使x中的makeInc设置为5,然后创建一个函数 y。这个inc函数知道x等于5并且只要它存在就会记住它 - 这就是闭包的概念(在你的背包中出现在出生时环境中所有需要的变量)。

致电inc5(12)执行inc(12)。如果调用inc,则会将y的参数x添加为inc5的值,{{1}}会记住该值为5,因此总和为17。

N.B。:闭包在JavaScript等语言中被自然使用。在Python中,可以使用闭包 也是如此,但是并没有经常使用,一些开发人员正在考虑他们甚至是邪恶 - 你的问题表明 非常清楚,理解代码中发生的事情并非易事 - 这是违背的 &#34;可读性计数&#34;来自Python的Zen。你也可以找到一些与范围有关的惊喜 变量的可见性。如果您没有得到上面代码中发生的确切内容,请执行 不用担心,Python提供了许多其他很好的挑战性结构,您将更频繁地使用它们 (列表理解就是一个例子)。

答案 1 :(得分:2)

其他答案解释得很清楚,但这里是代码中发生的事情的逐行细分

 def makeInc(x): # define a function makeInc that takes a variable x

     # when makeInc is executed, define a function "inc" that takes a variable y
     def inc(y):
         # when inc is executed, return the sum (where x is closed in the outer function)
         # note this is not executed when makeInc is called
         return y + x

     # don't call inc yet, just return a reference to the function itself - note there
     # are no parenthesis after inc
     return inc

 inc5 = makeInc(5) # now execute makeInc which returns a reference to the inc function 
                   # with the variable x captured by the closure

 inc5(12) # now call the result of the above which is the only place that we call inc
          # note the parenthesis to designate the function call

 # print inc5(12) gives 17

理解这一点的核心是作为对象的函数的概念。在Python中,您可以这样做:

>>> def test(x):
...     return x + 6
...
>>> test(1) # call test with the argument x = 1
7
>>> a = test # assign the function "test" to a new variable "a" - this is not calling test
>>> a
<function test at 0x101cfbb90> # printing a shows the original function name "test"
>>> a(1) # now call that function again with the same value for x = 1
7

当调用makeInc时,它返回对inc的引用,其中有一个不同的函数签名(使用一个名为y的参数)。他们都只提出一个论点这一事实并不重要。