鱼C论坛

 找回密码
 立即注册
查看: 1443|回复: 4

[已解决]python中的闭包问题?

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

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

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

x
本帖最后由 zyj1214 于 2021-7-11 16:28 编辑

def foo():
    print("hello world in foo")
    name="python"
                              
    def bar():
        print(name)
        print("hello world in bar")
    return bar
f1=foo()
def func():
    name="aaaaa"
   
f1()
func()  

运行结果为什么是这样的?
hello world in foo
python
hello world in bar
最佳答案
2021-7-11 16:39:08

因为你执行顺序是 foo() --> f1() --> func() 即函数执行顺序为: foo() --> bar() --> func()

这里按照执行顺序很容易看出来打印结果如下:

因为先调用函数 foo() 则先执行 foo 函数中的 print ,打印出 hello world in foo

而后调用 f1() 即 bar() ,则先打印 print(name) ,那么打印出 Python ,而后打印 print("hello world in bar")

最后在调用 func 函数,这个函数没有进行打印,所以实际效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-11 16:39:08 | 显示全部楼层    本楼为最佳答案   

因为你执行顺序是 foo() --> f1() --> func() 即函数执行顺序为: foo() --> bar() --> func()

这里按照执行顺序很容易看出来打印结果如下:

因为先调用函数 foo() 则先执行 foo 函数中的 print ,打印出 hello world in foo

而后调用 f1() 即 bar() ,则先打印 print(name) ,那么打印出 Python ,而后打印 print("hello world in bar")

最后在调用 func 函数,这个函数没有进行打印,所以实际效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-11 16:55:19 | 显示全部楼层
Twilight6 发表于 2021-7-11 16:39
因为你执行顺序是 foo() --> f1() --> func() 即函数执行顺序为: foo() --> bar() --> func()

这里按 ...

def foo():
    print("hello world in foo")
    name="python"
                              
    def bar():
        print(name)
        print("hello world in bar")
    return bar
f1=foo() #这里是不是把foo()函数调用结束后的返回值赋值给f1,
            #因为这里的返回值是 bar()函数的内存地址,所以f1的值
           #就是 bar()函数在内存中的地址...可以这样理解吗?
def func():
    name="aaaaa"
   
f1()#这里为什么f1后面要加小括号,才是调用 bar()函数?不理解?
     #能给解释一下吗?
func()  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-11 16:58:35 | 显示全部楼层
zyj1214 发表于 2021-7-11 16:55
def foo():
    print("hello world in foo")
    name="python"


这里为什么f1后面要加小括号


因为你前面调用 foo() ,而 foo() 函数返回的是 bar 函数体,所以你 f1 = foo() 就相当于 f1 = bar,则 f1() 就相当于 bar()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-11 17:14:30 | 显示全部楼层
Twilight6 发表于 2021-7-11 16:58
因为你前面调用 foo() ,而 foo() 函数返回的是 bar 函数体,所以你 f1 = foo() 就相当于 f1 = bar ...

def foo():
    print("hello world in foo")
    name="python"
                              
    def bar():
        print(name)
        print("hello world in bar")
    return bar
f1=foo() #这里是不是把foo()函数调用结束后的返回值赋值给f1,
            #因为这里的返回值是 bar()函数的函数名bar,所以f1的值
           #就是 bar,,那么f1就是bar,f1=bar这个函数名.
def func():
    name="aaaaa"
   
f1()#因为f1=bar函数名..所以f1 加 小括号 就是调用bar()函数...
    #这样就理解了...
func()  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-14 19:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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