鱼C论坛

 找回密码
 立即注册
查看: 256|回复: 3

[已解决]小白求助

[复制链接]
发表于 2025-3-13 22:47:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def funX():

    x = 5

    def funY():

        nonlocal x

        x += 1

        return x

    return funY



a = funX()

print(a())

print(a())

print(a())

请问结果为甚麽是6,7,8
最佳答案
2025-3-13 23:07:19
本帖最后由 jackz007 于 2025-3-13 23:47 编辑
def funX():
    x = 5
    def funY():
        nonlocal x   #  声明变量 x 为外层函数同名变量
        x += 1       #  x = x + 1
        return x     #  返回 x
    return funY      #  返回内嵌函数 funY 的调用句柄

a = funX()           # a 与 funX() 的内嵌函数 funY() 绑定,同时被绑定的还包括 funY() 的外部变量 x,从此,a() 就是 funY()
print(a())           # funY() 的外部变量 x = 5,调用 funY(),x = x + 1,打印 6
print(a())           # funY() 的外部变量 x = 6,调用 funY(),x = x + 1,打印 7
print(a())           # funY() 的外部变量 x = 7,调用 funY(),x = x + 1,打印 8

        通过此例可以看到,利用闭包的机制可以为内嵌函数开辟保留变量(x),闭包一经初始化,这种类型的变量就开始存在,其数值会一直保持,并不会随着函数调用结束而消失。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2025-3-13 22:50:10 | 显示全部楼层
这个代码的执行结果是 **6, 7, 8**,让我们一步步分析原因。  

### 代码解析:
def funX():
    x = 5  # 在 funX 内部定义变量 x

    def funY():
        nonlocal x  # 声明 x 为 funX 作用域内的变量
        x += 1  # x 在 funY 内部递增
        return x

    return funY  # 返回 funY 函数

### 执行过程:
1. `a = funX()`  
   - `funX()` 被调用,创建了 `x = 5`,并返回 `funY` 这个函数对象给 `a`。  
   - 现在 `a` 其实就是 `funY`,但 `x` 仍然存在于 `funX` 的作用域中。

2. `print(a())`  
   - `a()` 相当于调用 `funY()`,`nonlocal x` 让 `x` 变成 `funX` 作用域内的变量。  
   - `x += 1`,所以 `x` 变成 `6`,然后返回 `6`,打印 `6`。

3. `print(a())`  
   - 再次调用 `a()`,`x` 继续递增,变成 `7`,返回 `7`,打印 `7`。

4. `print(a())`  
   - 再次调用 `a()`,`x` 继续递增,变成 `8`,返回 `8`,打印 `8`。

### 关键点:
- `nonlocal x` 让 `x` 绑定到 `funX` 作用域,而不是 `funY` 内部的新变量。
- `funX` 只执行了一次,`x` 只初始化了一次(`x = 5`)。
- `funY` 每次调用时,`x` 都会在原来的基础上递增,而不是重新初始化。

### 结论:
所以最终的输出是:
6
7
8

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-3-13 23:07:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2025-3-13 23:47 编辑
def funX():
    x = 5
    def funY():
        nonlocal x   #  声明变量 x 为外层函数同名变量
        x += 1       #  x = x + 1
        return x     #  返回 x
    return funY      #  返回内嵌函数 funY 的调用句柄

a = funX()           # a 与 funX() 的内嵌函数 funY() 绑定,同时被绑定的还包括 funY() 的外部变量 x,从此,a() 就是 funY()
print(a())           # funY() 的外部变量 x = 5,调用 funY(),x = x + 1,打印 6
print(a())           # funY() 的外部变量 x = 6,调用 funY(),x = x + 1,打印 7
print(a())           # funY() 的外部变量 x = 7,调用 funY(),x = x + 1,打印 8

        通过此例可以看到,利用闭包的机制可以为内嵌函数开辟保留变量(x),闭包一经初始化,这种类型的变量就开始存在,其数值会一直保持,并不会随着函数调用结束而消失。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-3-14 19:55:42 | 显示全部楼层
闭包函数funY通过nonlocal关键字捕获了外层函数funX的变量x。每次调用a()时都会修改并返回这个持久化的x值,因此三次调用依次输出6、7、8。该现象展示了Python闭包对外部作用域变量的记忆特性。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-2 02:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表