LEEFEI571 发表于 2025-1-19 16:31:21

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

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

>>> 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的值?望大神指教!

FishC 发表于 2025-1-19 16:31:33

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

下面是一个实现的例子:


x = 100# 全局变量

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

    funB()

funA()
print(x)# 输出 520


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

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


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


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2025-1-19 20:12:19

本帖最后由 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)

某一个“天” 发表于 2025-1-19 20:18:58

当然是nonlocal,global 了,这个报错是因为global 后没有外层变量了

某一个“天” 发表于 2025-1-19 20:20:50

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

某一个“天” 发表于 2025-1-19 20:21:46

我改的这个格式不太对,道理就这样
页: [1]
查看完整版本: 使用nonlocal及global语句在嵌套函数中逐层修改变量并最终能够修改全局变量的值的疑问