鱼C论坛

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

[已解决]关于nonlocal函数

[复制链接]
发表于 2024-11-11 16:16:45 | 显示全部楼层 |阅读模式

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

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

x
我在书上看到这样的实例                                                                                             
def funx():                                                        def funx():                                                     
        x = [5]                                                                x = [5]
        def funy():                                                                def funy():
                nonlocal x                                                                nonlocal x
                x[0] = x[0] + 3                                                        x[0] = x[0] +3
                return x[0]                                                                return x[0]
        return funy                                                        return funy

temp = funx()                                                                temp = funx()
temp() #我回车后显示数字是7                                        temp()   #这次回车的就是8了
这跟我不是很懂,有那个大神可以告诉一下吗
最佳答案
2024-11-11 16:16:56
你提到的代码看起来是某个示例,但它在呈现时出现了一些格式问题,让我来为你解释一下这个例子,以及为什么结果会变化。

首先,假设函数定义为:
def funx():
    x = 4   # 起始值设为4
    def funy():
        nonlocal x   # 使用 nonlocal 关键字,表示要修改外层函数 funx 的局部变量 x
        x = x + 3    # x 的值增加 3
        return x
    return funy

这个代码意味着 `funy` 函数可以访问和修改 `funx` 函数中的 `x` 变量。

当你执行以下代码:
temp = funx()  # 此时,x 初始化为 4,返回了 funy 函数
print(temp())  # 调用 funy,x 从 4 变为 7,输出 7
print(temp())  # 再次调用 funy,x 从 7 变为 10,输出 10

因此,`temp()` 的每次调用都会使 `x` 的值递增 3。在首次调用 `temp()` 时,`x` 的值变为 7;在第二次调用 `temp()` 时,由于 `x` 的值已经变为了 7,再次加 3 后得到 10。因此,你看到的输出会是 7 和 10,而不是 7 和 8。

如果你遇到执行结果有变化,很可能是由于某个地方改变了变量的初始化值或其他代码结构,确保你的代码和分析一致会帮助你理解结果。

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

使用道具 举报

发表于 2024-11-11 16:16:56 | 显示全部楼层    本楼为最佳答案   
你提到的代码看起来是某个示例,但它在呈现时出现了一些格式问题,让我来为你解释一下这个例子,以及为什么结果会变化。

首先,假设函数定义为:
def funx():
    x = 4   # 起始值设为4
    def funy():
        nonlocal x   # 使用 nonlocal 关键字,表示要修改外层函数 funx 的局部变量 x
        x = x + 3    # x 的值增加 3
        return x
    return funy

这个代码意味着 `funy` 函数可以访问和修改 `funx` 函数中的 `x` 变量。

当你执行以下代码:
temp = funx()  # 此时,x 初始化为 4,返回了 funy 函数
print(temp())  # 调用 funy,x 从 4 变为 7,输出 7
print(temp())  # 再次调用 funy,x 从 7 变为 10,输出 10

因此,`temp()` 的每次调用都会使 `x` 的值递增 3。在首次调用 `temp()` 时,`x` 的值变为 7;在第二次调用 `temp()` 时,由于 `x` 的值已经变为了 7,再次加 3 后得到 10。因此,你看到的输出会是 7 和 10,而不是 7 和 8。

如果你遇到执行结果有变化,很可能是由于某个地方改变了变量的初始化值或其他代码结构,确保你的代码和分析一致会帮助你理解结果。

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

使用道具 举报

发表于 2024-11-11 17:08:14 | 显示全部楼层
本帖最后由 jackz007 于 2024-11-11 17:09 编辑

       为什么要并列写 2 个代码,2 个代码完全一样,不知道你想说什么。但是,无论怎么样,你说的现象是完全不可能发生的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-11 17:44:55 | 显示全部楼层
打错字的问题。不太可能发生这种情况,除非内存受损
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-4 01:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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