旧版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 就没有被重新初始化。
这句话无法理解呀,哪位大佬能通俗地讲一讲嘛? 函数里面的变量就是局部变量,一般只有当函数被调用的时候,局部变量才会被定义,当结束函数时候,局部变量便会被释放。
而你的代码中 a = funX(),表示 a 指向 funX() 对象,意思就是 a 就是 funX(),比如:b = 13,一般你没有释放 b,13 就会一直存放在 b 里。 a=funX(),函数返回的是funY,并没有括号,函数调用是要有括号的,这个时候a就相当于funY,因为a已经赋值funX()了,然后,a=funY,你可以这么理解,然后a() ,其实就相当于funY(),
傻眼貓咪 发表于 2021-10-25 19:45
函数里面的变量就是局部变量,一般只有当函数被调用的时候,局部变量才会被定义,当结束函数时候,局部变量 ...
“一般只有当函数被调用的时候,局部变量才会被定义”,在这个代码里面 a() 不是表示调用了funX()一次吗? 深谙流年 发表于 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()) AliciaChen 发表于 2021-10-26 15:41
对,我能理解a() = funY(), 但是为什么连续print(a())三次,每次x的值都能迭代+1呢?
是不是因为print(a( ...
可以这么理解,x在里面是局部变量,a=funX()后,x相当于funX的全局变量,然后运行funY(),就改变了x的值,相当于函数中的函数,变量与局部变量全局变量的关系
页:
[1]