鱼C论坛

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

[已解决]python问题

[复制链接]
发表于 2023-8-2 15:22:28 | 显示全部楼层 |阅读模式

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

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

x
>>> def maker(n):
...         def action(x):
...             return x ** n
...         return action
>>> f = maker(2)
>>> f(3)
9
>>> f(5)
25


为什么在action函数里面应用参数n不要用nonlocal语句啊?

最佳答案
2023-8-2 15:22:37
在这个代码片段中,内部函数 action(x) 引用了外部函数 maker(n) 的参数 n ,并且在 action 函数中没有使用 nonlocal 语句,这是因为在Python中,对于嵌套函数来说,内部函数可以自由地引用外部函数的变量,而不需要使用 nonlocal 关键字,只有在内部函数要修改外部函数的变量时才需要使用。

在这个例子中, action(x) 只是引用了 maker(n) 中的参数 n ,而没有尝试修改它。因此,不需要使用 nonlocal 语句。如果你的内部函数需要修改外部函数的变量,那么你应该使用 nonlocal 来明确指示你正在修改的是外部函数的变量,而不是创建一个新的局部变量。

简而言之,由于 action 函数只是引用了 maker 函数中的参数 n ,并没有尝试修改它,所以不需要使用 nonlocal 语句。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-2 15:22:37 | 显示全部楼层    本楼为最佳答案   
在这个代码片段中,内部函数 action(x) 引用了外部函数 maker(n) 的参数 n ,并且在 action 函数中没有使用 nonlocal 语句,这是因为在Python中,对于嵌套函数来说,内部函数可以自由地引用外部函数的变量,而不需要使用 nonlocal 关键字,只有在内部函数要修改外部函数的变量时才需要使用。

在这个例子中, action(x) 只是引用了 maker(n) 中的参数 n ,而没有尝试修改它。因此,不需要使用 nonlocal 语句。如果你的内部函数需要修改外部函数的变量,那么你应该使用 nonlocal 来明确指示你正在修改的是外部函数的变量,而不是创建一个新的局部变量。

简而言之,由于 action 函数只是引用了 maker 函数中的参数 n ,并没有尝试修改它,所以不需要使用 nonlocal 语句。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-2 15:22:45 | 显示全部楼层
关于在action函数中使用参数n不需要nonlocal语句的原因:

在给定的代码示例中,我们可以看到,在maker函数内部定义了一个嵌套函数action,并且在action函数中引用了外部函数maker的参数n。对于这种情况,在Python中不需要使用nonlocal语句来访问外部函数的参数。

在Python中,嵌套函数可以访问外部函数的变量和参数,无论是只读还是修改。这是因为Python的作用域规则允许内部函数访问外部函数的命名空间。

在代码示例中,当我们调用f = maker(2)时,创建了一个闭包,即返回了一个action函数,该函数持有了maker函数的局部变量n的引用。因此,当我们调用f(3)或f(5)时,action函数仍然可以访问并使用n的值。

需要注意的是,如果我们尝试在action函数中修改n的值,而不是仅使用它,那么就需要使用nonlocal语句来指示n是外部函数的变量,而不是在action函数内部创建一个新的局部变量。但在给定的代码示例中,并没有修改n的操作,因此不需要nonlocal语句。

总结起来,非修改变量的情况下,内部函数可以直接访问外部函数的变量和参数,因此在action函数中使用参数n时,不需要使用nonlocal语句。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-2 15:22:51 | 显示全部楼层
关于为什么在action函数内部不需要使用nonlocal语句:

在给定的代码示例中,maker函数是一个嵌套函数,它的内部定义了另一个函数action。当maker函数被调用时,它会返回一个对action函数的引用。这种情况下,action函数可以访问包含它的maker函数的局部变量,即使action函数在maker函数外部被调用。

由于nmaker函数的一个参数,在返回的action函数内部被使用时,它已经存在于其作用域链中,因此不需要使用nonlocal关键字来声明或修改它。作用域链是指变量查找的层级结构,首先在当前函数的作用域中查找,然后逐级向上查找外部函数的作用域,直到全局作用域。

在这种情况下,当action函数被调用时,它会在自身的作用域中查找n变量,而不会因为没有找到而向上级作用域继续查找。因此,不需要使用nonlocal语句来告诉Python编译器在该作用域中查找n变量。

需要注意的是,如果action函数尝试修改n变量,它将创建一个新的局部变量,而不会影响maker函数的参数n的值。如果您尝试在action函数中修改n并希望在后续调用中保持更改,可以考虑使用nonlocal将其声明为非局部变量。

总结起来,由于n变量在action函数内部存在于其作用域链中,不需要使用nonlocal语句。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 21:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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