爱笑的无赖 发表于 2022-5-12 09:11:19

关于闭包的问题 求解惑

下面这个是异常处理的课后题。
def my_fun1():
      x = 5
      def my_fun2():
                x *= x
                return x
      return my_fun2()

my_fun1()

确实如视频里讲的, 内部函数不能直接调用外部函数, 要重新定义函数本身, 或者要加nonlocal

那么问题来了。
def my_fun1():
    list1 = []

    def my_fun2():
      list1.append(2) #为什么list可以直接调用外面定义的list
      return list1

    return my_fun2()


my_fun1()

为什么我在外部函数定义了list1 可以直接拿到内部函数里来用
{:5_107:}

Twilight6 发表于 2022-5-12 09:13:33

本帖最后由 Twilight6 于 2022-5-12 09:14 编辑



函数中的内嵌函数,相对与外部函数属于局部

而外部函数相对于这个内嵌函数属于全局,所以 my_fun2 中 可以用 my_fun1 的变量

有关闭包的例子可以看看这篇帖子:

[已解决] 20讲闭包例子
https://fishc.com.cn/thread-175884-1-1.html



isdkz 发表于 2022-5-12 09:14:38

访问是可以访问的,只是不能赋值,append 是原地操作,

并没有重新赋值

豆嘉木 发表于 2022-5-12 09:38:26

list1在外面my_fun1函数里,my_fun2属于my_fun1,所以里面的函数可以调用外部函数声明的列表,你学了c就知道了,列表其实就是第一个元素的地址,在外部函数结束之前不会被销毁所以可以调用
页: [1]
查看完整版本: 关于闭包的问题 求解惑