为了账号安全,请及时绑定邮箱和手机立即绑定

def f(m = i): 这行代码中 ‘m = i’该如何理解?

def count():
    fs = []
    for i in range(1, 4):
        def f(m = i):
            return m ** 2
        fs.append(f)
    return fs
f1, f2, f3 = count()
print f1(), f2(), f3()

for循环中函数f的定义语句def f(m = i):

如何理解m = i?函数带一个参数?可调用时没有传入参数啊

正在回答

1 回答

我的理解是,之前没有使用m==i时,def f(i)中传入的i是对象i的引用,而i每次递增会导致i改变,最后f1,f2,f3 = count()使得3者返回都为计算i*i的函数对象,且i相同,则执行f1() f2()  f3()结果也相同

m==i使得每次传入参数时,新建个局部变量m,作用域在f函数内,这样3次的m都是各自函数对象的局部变量,指向不同的int型对象,实现了保存当时的i值,则结果也被改变了

函数f的确时带一个参数,调用f1 f2 f3 = count()时,count内部写死了给f传入i参数

0 回复 有任何疑惑可以回复我~
#1

wheeeat 提问者

你的点我get了 我的疑问在于 m = i 的名分是什么?是参数?可以这个地方的调用不应该带参数。比如我把代码改为: def count(): fs = [] for i in range(1, 4): def f(i): return i fs.append(f) return fs f1, f2, f3 = count() print f1(), f2(), f3() 此时会报错,提示调用f()应带一个参数(当前带了0个参数)。所以m = i这句算什么呢?
2016-06-20 回复 有任何疑惑可以回复我~
#2

梦到慈世平 回复 wheeeat 提问者

m = i的确是参数,且是带默认值i的参数,所以才没有报错 你的代码def f(i),此处的i为形参,应该传入参数,然而f1, f2, f3 = count(),此处得到的正是def f(i)的函数对象,下面f1()必须传参数进去才行,改成 f1(1)就不会报错 总结就是m= i是传默认参数进去了 这个地方不好理解,主要是理解函数也是对象的思想,这点我理解也不是很好,所以也只能说到这里,不够透彻
2016-06-21 回复 有任何疑惑可以回复我~
#3

wheeeat 提问者 回复 梦到慈世平

你说的挺好。我觉得我明白了。谢谢!
2016-06-22 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

def f(m = i): 这行代码中 ‘m = i’该如何理解?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信