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

关于例题代码的理解

例题代码如下:def count():
   fs = []
   for i in range(1, 4):
       def f():
            return i*i
       fs.append(f)
   return fs

f1, f2, f3 = count()

请问:

  1. 是在运行完for循环,直到 i =3之后才会退出循环,再return fs么?之前的i=1,i=2是都没有添加进fs,白运行了么?

  2. ‘f1、f2、f3并没有被调用’这句话怎么理解呢?


正在回答

2 回答

count()函数中,fs是一个列表,它的元素不是计算出来的i*i的值,而是内部定义的函数f,你可以尝试输出f1 f2 和 f3 得到的是三个函数类型的变量,这样当你返回fs列表时,fs中就是三个函数类型的f,这三个函数除了在内存中地址不一样外,其它性质完全一样,当你调用f1()  f2() f3() 时,他才会调用这些f进行计算,而不是在count函数内计算完后才append的,此时i都是3,所以结果也都是9

这也是闭包的一个特点,建议你可以去百度一下python闭包在游戏中角色运动的应用

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

sulyeonW 提问者

谢谢~
2017-03-09 回复 有任何疑惑可以回复我~
#2

慕粉1450121606

你好,想问一下为什么此时fs的元素不是计算出来的i*i固定值,而是函数f呢?不是每计算出一个i*i都添加到fs里面了吗?还有f1,f2,f3中的123是从哪里冒出来的呢?程序是怎么理解这个123的?谢谢
2017-03-17 回复 有任何疑惑可以回复我~
#3

hgjkgsfhskg 回复 慕粉1450121606

fs列表中append的是f,而不是f(),python中函数名也是一个变量,你可以试着写一个函数,然后输出它的函数名(不带括号和参数),你得到的是一个叫function类型的东西,还有一串地址,那是函数在内存里的地址。一旦这个函数名带上了括号(需要参数时还需要传入参数),那就是调用这个函数,编译器去这个内存地址拉出这个函数然后执行。 综上,你仔细看看代码,f和f()不是同一个东西
2017-03-19 回复 有任何疑惑可以回复我~
#4

Ramon_Lee 回复 hgjkgsfhskg

你好,我看答案中有人这么做, def count(): fs = [] for i in range(1, 4): def f(i): return i*i fs.append(f(i)) return fs f1, f2, f3 = count() print f1(), f2(), f3() 这种做法是直接append(f(i))的,是否可行呢,我看在python2中报错了,不知这种用法是不是python3的用法
2017-05-03 回复 有任何疑惑可以回复我~
查看1条回复

f1() 为什么此时i=3 而不是 1 或者2 呢?

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

hgjkgsfhskg

python是类似于Java的垃圾回收机制,你在f()函数里定义的i,虽然在函数外访问不到,但它还是存在于内存中,而f记住的是这个i的地址,f1 f2 f3记住的都是这个i,所以运行时结果肯定相同,i是3
2017-11-13 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

关于例题代码的理解

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