我有这段代码,我对它的执行感到困惑:
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
答案 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的参数)。他们都只提出一个论点这一事实并不重要。