鱼C论坛

 找回密码
 立即注册
查看: 3064|回复: 12

[已解决]闭包的疑惑

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

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

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

x
def a():
        x=5
        def b():
                return x
        return b()


这个不会出错!  这个不是闭包吗??
def a():
        x=5
        def b():
                x+=1
                return x
        return b()
为啥出错了

闭包只有在运算是才算吗??
最佳答案
2021-8-28 11:25:46
本帖最后由 sunrise085 于 2021-8-28 11:29 编辑

这个问题问的好。
其实你这是两个问题。

第一,这不是闭包。函数a返回的是b()是调用函数b的结果,而不是返回函数b本身。所以这不是闭包

第二,你这个问题其实是变量作用域的问题。
         第一种写法,在函数b中没有重新定义同名局部变量x,仅仅是使用了x,会在上一层去寻找x。
         第二种写法,在函数b中修改了变量x,但是有没有发现定义局部变量x也没有global声明为外部x,所以就报错了。
可以去看看我的一个有关于作用域帖子:Python细节之7、global 与 nonlocal 的使用
若对作用域有一些了解,可以重点看一下第四部分。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-28 11:12:46 | 显示全部楼层
def a():
        x=5
        def b(x):
                x+=1
                return x
        return b(x)
print(a())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-28 11:13:32 | 显示全部楼层
变量x不在函数b内,无法直接修改,要通过函数参数传进去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-28 11:20:35 | 显示全部楼层
主要是因为没有让解释器清楚变量x是全局变量还是局部变量

在函数内部对变量x赋值进行修改后,变量x就会被Python解释器认为是局部变量而非全局变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-28 11:25:46 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2021-8-28 11:29 编辑

这个问题问的好。
其实你这是两个问题。

第一,这不是闭包。函数a返回的是b()是调用函数b的结果,而不是返回函数b本身。所以这不是闭包

第二,你这个问题其实是变量作用域的问题。
         第一种写法,在函数b中没有重新定义同名局部变量x,仅仅是使用了x,会在上一层去寻找x。
         第二种写法,在函数b中修改了变量x,但是有没有发现定义局部变量x也没有global声明为外部x,所以就报错了。
可以去看看我的一个有关于作用域帖子:Python细节之7、global 与 nonlocal 的使用
若对作用域有一些了解,可以重点看一下第四部分。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-28 16:47:57 | 显示全部楼层
青出于蓝 发表于 2021-8-28 11:13
变量x不在函数b内,无法直接修改,要通过函数参数传进去

大神这个需要什么参数传进去  能举个例子吗?》
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-28 16:50:53 | 显示全部楼层
逃兵 发表于 2021-8-28 11:20
主要是因为没有让解释器清楚变量x是全局变量还是局部变量

在函数内部对变量x赋值进行修改后,变量x就会 ...

大神 这个x  本来不就是局部变量吗 ?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-28 16:55:18 | 显示全部楼层
asa616628217 发表于 2021-8-28 16:50
大神 这个x  本来不就是局部变量吗 ?

x是a的局部变量
b在a的内部
所以x相当于b的全局变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-28 17:26:48 | 显示全部楼层
逃兵 发表于 2021-8-28 16:55
x是a的局部变量
b在a的内部
所以x相当于b的全局变量

谢谢大神  
再问一个问题
def a():
        x=3
        def b():
                print(x)
                return x+1
        b()
a()  返回结果为什么是一个4  
def a():
        x=3
        print(x)
        return x+1
a() 为什么这个返回两个结果 3  4
第一个函数里边b() 不应该就是两个结果吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-28 17:29:53 | 显示全部楼层
def a():
        x=3
        def b():
                print(x)
                return x+1
        b()

这段代码,a没有返回值,只是在a中执行一次b,b的内容是打印,所以只有3
def a():
        x=3
        print(x)
        return x+1
这段代码,先打印,然后返回
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-28 18:07:23 | 显示全部楼层
逃兵 发表于 2021-8-28 17:29
这段代码,a没有返回值,只是在a中执行一次b,b的内容是打印,所以只有3

谢谢大神 有点深奥!
def a():
        x=3
        def b():
                print(x)
                return x+1
        b()
这个函数a()不就是返回函数b()吗

def a():
        x=3
        def b():
                print(x)
                return x+1
       return  b()
下边这个就有两个了 ? 这个返回的为什么是b()函数里的值?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-29 08:10:31 | 显示全部楼层
asa616628217 发表于 2021-8-28 18:07
谢谢大神 有点深奥!
def a():
        x=3

return才是返回
没有return只是执行,但是不接收返回的数据

上面的函数a没有return,所以没有返回值
下面的a有return,返回b(),而b()的return为x+1
a就是return   b  的  return 值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-29 12:49:16 | 显示全部楼层
逃兵 发表于 2021-8-29 08:10
return才是返回
没有return只是执行,但是不接收返回的数据

谢谢 大神!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-4 17:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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