dlyyyyyyy 发表于 2020-8-28 17:43:11

关于闭包里面局部变量的问题

x=5
def fun1():
    def fun2():
      x*=x
      return x
    return fun2()
fun1()
报错:local variable 'x' referenced before assignment说x是局部变量,但在函数之前定义的变量不应该是全局变量吗?

1q23w31 发表于 2020-8-28 17:55:08

不是,x的作用域在函数体之外不属于全局变量,除非x是列表和字典等容器型变量

UncleMonster 发表于 2020-8-28 18:58:37

首先,fun2()函数是内嵌函数,
也就是只有在fun1被调用时才能调用fun2,
内嵌函数内的变量属于局部变量,也就是调用不了任何外部变量,只能调用fun2函数内存在的变量
而fun1是不属于内嵌函数的,可以直接调用外部变量,参考下面代码:
x = 5
def fun1():
    s = x
    def fun2():
      nonlocal s
      s *= s
      return print(s)
    return fun2()

fun1()

通过在函数fun1内设置一个名为s的变量并把外部x的变量赋值给s
然后在内嵌函数fun2中使用nonlocal函数声明变量s是全局变量,可以被内嵌函数调用
再来调用s进行计算
最后返回打印出s的值
【仅凭已知知识得出经验,还没学完,不是大佬,如有不对麻烦大佬指点{:10_258:} 】
【如果本帖对你有帮助且问题解决话楼猪别忘了设置最佳{:10_297:} 】

dlyyyyyyy 发表于 2020-9-5 13:16:28

因为x是闭包内的局部变量,被屏蔽,所以在fun2里面依然是没有被定义的状态
容器类型则不会被屏蔽(列表,元组,字典)
或者在闭包中用nonlocal
页: [1]
查看完整版本: 关于闭包里面局部变量的问题