鱼C论坛

 找回密码
 立即注册
查看: 61|回复: 5

使用nonlocal及global语句在嵌套函数中逐层修改变量并最终能够修改全局变量的值的疑问

[复制链接]
发表于 5 天前 | 显示全部楼层 |阅读模式

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

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

x
小甲鱼老师在嵌套函数的客户题中有这么一个例子,如下:

>>> x = 100
>>> def funA():
...     global x
...     x = 250
...     def funB():
...         nonlocal x
...         x = 520
...     funB()
...
>>> funA()
>>> print(x)


解析答案为会报错,因为外层的 x 变量已经被提前一步定义为全局变量了(也就相当于外层不存在一个叫 x 的局部变量),于是找不到外层的同名的 x 变量,所以便会报错(SyntaxError: no binding for nonlocal 'x' found)。

我好奇想问问有没有办法能够使嵌套函数内的值修改到外层函数x的值,以及全部变量x的值?望大神指教!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 5 天前 | 显示全部楼层
要实现嵌套函数逐层修改变量的值,**并确保最终可以修改到全局变量的值**,我们可以结合 `global` 和可变类型(如列表或字典)来实现。

下面是一个实现的例子:
x = 100  # 全局变量

def funA():
    global x
    x = [250]  # 将全局变量变为可变类型(列表)
    
    def funB():
        x[0] = 520  # 修改列表中的值

    funB()

funA()
print(x[0])  # 输出 520

这样,你可以成功修改嵌套变量的值,并且能改变全局变量的值。

### **解析步骤:**

  • 在最外层使用 `global x`,将全局变量 `x` 修改为列表 `[250]`。
  • 在内部函数中,直接通过 `x[0]` 修改列表的值。
  • 因为列表是可变类型,其修改会直接影响全局变量。


通过这种方法,**既避免了 `nonlocal` 报错的问题,同时也实现了嵌套函数对全局变量的逐步修改**。

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

使用道具 举报

发表于 5 天前 | 显示全部楼层
本帖最后由 jackz007 于 2025-1-19 20:14 编辑

         在每一个用到 x 的函数内,只要在为 x 赋值前,都先将 x 声明为 global,那么,就可以保证所有函数内外所使用到的就是同一个 x。
def funA():
    global x
    x = 250
    def funB():
        global x
        x = 520
    funB()

x = 100
funA()
print(x)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
当然是nonlocal,global 了,这个报错是因为global 后没有外层变量了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
x = 100
>>> def funA():
...     global x
...     x = 250
….   y = 666
...     def funB():
...         nonlocal y
...         y = 520
...     funB()
….   print(y)
...
>>> funA()
>>> print(x)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
我改的这个格式不太对,道理就这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-24 02:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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