AliciaChen 发表于 2021-10-25 19:33:02

旧版python第20课06题

以下是“闭包”的一个例子,请你目测下会打印什么内容?
def funX():
    x = 5
    def funY():
      nonlocal x
      x += 1
      return x
    return funY

a = funX()
print(a())
print(a())
print(a())

小甲鱼的解释是:当 a = funX() 的时候,只要 a 变量没有被重新赋值,funX() 就没有被释放,也就是说局部变量 x 就没有被重新初始化。

这句话无法理解呀,哪位大佬能通俗地讲一讲嘛?

傻眼貓咪 发表于 2021-10-25 19:45:36

函数里面的变量就是局部变量,一般只有当函数被调用的时候,局部变量才会被定义,当结束函数时候,局部变量便会被释放。
而你的代码中 a = funX(),表示 a 指向 funX() 对象,意思就是 a 就是 funX(),比如:b = 13,一般你没有释放 b,13 就会一直存放在 b 里。

深谙流年 发表于 2021-10-25 19:45:36

a=funX(),函数返回的是funY,并没有括号,函数调用是要有括号的,这个时候a就相当于funY,因为a已经赋值funX()了,然后,a=funY,你可以这么理解,然后a() ,其实就相当于funY(),

AliciaChen 发表于 2021-10-26 15:35:18

傻眼貓咪 发表于 2021-10-25 19:45
函数里面的变量就是局部变量,一般只有当函数被调用的时候,局部变量才会被定义,当结束函数时候,局部变量 ...

“一般只有当函数被调用的时候,局部变量才会被定义”,在这个代码里面 a() 不是表示调用了funX()一次吗?

AliciaChen 发表于 2021-10-26 15:41:36

深谙流年 发表于 2021-10-25 19:45
a=funX(),函数返回的是funY,并没有括号,函数调用是要有括号的,这个时候a就相当于funY,因为a已经赋值funX ...

对,我能理解a() = funY(), 但是为什么连续print(a())三次,每次x的值都能迭代+1呢?
是不是因为print(a())运行第一次之后,x=6, 也就是说:这里就改变了funX()函数里面的局部变量x,变成了6。
就相当于以下的代码吗?
def funX():
    x = 6
    def funY():
      nonlocal x
      x += 1
      return x
    return funY

a = funX()
print(a())
print(a())

深谙流年 发表于 2021-10-26 20:10:52

AliciaChen 发表于 2021-10-26 15:41
对,我能理解a() = funY(), 但是为什么连续print(a())三次,每次x的值都能迭代+1呢?
是不是因为print(a( ...

可以这么理解,x在里面是局部变量,a=funX()后,x相当于funX的全局变量,然后运行funY(),就改变了x的值,相当于函数中的函数,变量与局部变量全局变量的关系
页: [1]
查看完整版本: 旧版python第20课06题