鱼C论坛

 找回密码
 立即注册
查看: 1192|回复: 6

【Python:嵌套函数问题】

[复制链接]
发表于 2018-3-22 18:59:51 | 显示全部楼层 |阅读模式

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

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

x

def multipliers(n):    funcs = []    for i in range(0,n):        def _func(b):            return i * b        funcs.append(_func)    return funcsms = multipliers(10)ms[2](3)   # 27, 9 * 3
---------------------------------------------来自网络。

知道是运行时解析,可还是不太明白为什么i=9
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-22 19:00:28 | 显示全部楼层
def multipliers(n):
    funcs = []
    for i in range(0,n):
        def _func(b):
            return i * b
        funcs.append(_func)
    return funcs

ms = multipliers(10)
ms[2](3)   # 27, 9 * 3
=========================

格式不对,重发~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-22 19:38:17 | 显示全部楼层
你这个原因是因为你把嵌套的函数又写进了一个循环里边,

你执行ms = multipliers(10)这条语句的时候,实际上返回的是一个列表,

各元素的类型都是 嵌套函数类型 ,也就是你的_func这个函数,因为你第一遍循环

就是执行ms = multipliers(10)这条语句的时候,i 已经从0加到 9 了,所以,当你再次

执行ms[2](3) 的时候直接就是 9*3,其实你执行ms[0](3) 、ms[1](3)、ms[7](3)结果

都会是27,不知道你明白了没有。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-22 20:59:30 | 显示全部楼层
为什么当执行ms=multipliers(10),i就是9,i不是从0开始增加的吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-22 21:53:15 | 显示全部楼层
这是由于Python的后期绑定(late binding)机制导致的,这是指在闭包中使用的变量的值,是在内层函数被调用的时候查找的。因此在上面的代码中,当任一返回函数被调用的时候,i 的值是在它被调用时的周围作用域中查找(到那时,循环已经结束了,所以i已经被赋予了它最终的值9)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-22 23:33:12 | 显示全部楼层
因为Python是解释性语言,是逐行翻译的——可以这样理解吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-23 21:44:54 | 显示全部楼层

绑定与作用域的规则:

    默认绑定到当前作用域
    解析名称时,会解析到最近一层绑定该名称的作用域    就是说其实0-9都绑定过,可是解析时只承认最后绑定的
    global/nonlocal可以修改这个特性
    定义时决定解析到哪个作用域;运行时决定解析的值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-29 08:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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