鱼C论坛

 找回密码
 立即注册
查看: 2942|回复: 11

有關嵌套調用問題

[复制链接]
发表于 2014-4-13 02:43:58 | 显示全部楼层 |阅读模式

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

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

x
  1. def tester(start):
  2.         state = start
  3.         def nested(label):
  4.                 print(label, state)
  5.                 state += 1
  6.                 return nested
复制代码


請問為什麼不能用以下調用?:
f = tester(0)
f("spam")

我在書上看到是可以調用f("spam")的, 但在3.3.4就調用不了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-13 08:48:27 | 显示全部楼层
楼主,你是不是没搞懂局部变量啊,在定义之前就调用,当然不能成功了啊,那个state,把小甲鱼老师的函数视频好好在复习复习吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-13 15:25:43 | 显示全部楼层
本帖最后由 kit1858644 于 2014-4-13 15:27 编辑

我是從書上直抄的, 詳情請看Python 学习手册中文版【第4版】第435頁。
而且根據LEGB法則應該是可以調用的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-14 00:25:14 | 显示全部楼层
def tester(start):
        state = start
        def nested(label):
                return print(label, (state + 1))
                #state += 1
        return nested


tester(0)('spam')

亲,看一下我的代码吧!希望能帮到你!{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-14 00:47:06 | 显示全部楼层
看看这个,这可能是你想要的哦!感觉你的代码语法有错误哦!试图改变外部全局变量state要用nonlocal关键字,另外不能在函数内部返回这个函数哦(很明显的缩进问题)!希望能帮到你!

def tester(start):
        state = start
        def nested(label):
                nonlocal state
                state += 1
                return print(label, state)
        return nested     

tester(0)('spam')


>>> ================================ RESTART ================================
>>>
spam 1
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-14 00:53:47 | 显示全部楼层
还有就是没有nonlocal的话内部函数nested没有办法访问到外部函数的变量state哦!
然后 print(label, state)会报错的!{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-14 08:31:28 | 显示全部楼层
kit1858644 发表于 2014-4-13 15:25
我是從書上直抄的, 詳情請看Python 学习手册中文版【第4版】第435頁。
而且根據LEGB法則應該是可以調用的 ...

楼主,麻烦你仔细看看435页的代码,是不是少了一行nonlocal state
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-21 00:03:39 | 显示全部楼层
最好是明天 发表于 2014-4-14 08:31
楼主,麻烦你仔细看看435页的代码,是不是少了一行nonlocal state

我提問的是這個: 20140421_000139_563.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-21 00:05:18 | 显示全部楼层
~风介~ 发表于 2014-4-14 00:53
还有就是没有nonlocal的话内部函数nested没有办法访问到外部函数的变量state哦!
然后 print(label, state ...

如果用到nonlocal我也明白, 但我就是不明白為什麼沒有nonlocal也可以正常調用。

真奇怪。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-21 07:48:04 | 显示全部楼层
kit1858644 发表于 2014-4-21 00:05
如果用到nonlocal我也明白, 但我就是不明白為什麼沒有nonlocal也可以正常調用。

真奇怪。

QQ截图20140421074821.png
是不是这个里面有猫腻啊?{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-21 15:03:48 | 显示全部楼层
~风介~ 发表于 2014-4-21 07:48
是不是这个里面有猫腻啊?

就算是课本也难免会有纰漏,正确代码:   
  1. >>> def tester(start):
  2.         state = start
  3.         def nested(label):
  4.                 nonlocal state
  5.                 print(label, state)
  6.                 state += 1
  7.         return nested

  8.         
  9. >>> f = tester(0)
  10. >>> f('spam')
  11. spam 0
复制代码

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

使用道具 举报

发表于 2014-4-21 15:12:47 | 显示全部楼层
kit1858644 发表于 2014-4-21 00:05
如果用到nonlocal我也明白, 但我就是不明白為什麼沒有nonlocal也可以正常調用。

真奇怪。

nested在tester里面,所以可以调用tester里的变量,但不能改变其值,同时,如果nested中重新声明变量state=1,那在nested中会新生成一个变量state,该变量与tester中的state同名,但两者作用域不一样,nested中的该变量在其声明后起作用,且仅对nested起作用,而在tester中,只认tester声明的state变量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 03:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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