鱼C论坛

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

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

[复制链接]
发表于 2020-8-28 17:43:11 | 显示全部楼层 |阅读模式

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

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

x
x=5
def fun1():
    def fun2():
        x*=x
        return x
    return fun2()
fun1()
报错:local variable 'x' referenced before assignment  说x是局部变量,但在函数之前定义的变量不应该是全局变量吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-28 17:55:08 | 显示全部楼层
不是,x的作用域在函数体之外不属于全局变量,除非x是列表和字典等容器型变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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的值
【仅凭已知知识得出经验,还没学完,不是大佬,如有不对麻烦大佬指点
【如果本帖对你有帮助且问题解决话楼猪别忘了设置最佳
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-9-5 13:16:28 | 显示全部楼层
因为x是闭包内的局部变量,被屏蔽,所以在fun2里面依然是没有被定义的状态
容器类型则不会被屏蔽(列表,元组,字典)
或者在闭包中用nonlocal
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 20:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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