- 帖子
- 8
- 精华
- 0
- 积分
- 31
- 阅读权限
- 10
- 注册时间
- 2024-2-8
- 最后登录
- 2024-2-20
|
本帖最后由 哈尔滨小电工 于 2024-2-9 09:53 编辑
crossin先生 发表于 2023-7-22 01:31
好问题!
这里函数中的变量i是在外部作用域中定义的,对函数而言不是局部变量,所以这里的 i 在实现上传递 ...
时间戳:2024.2.9
要得到1,4,9只要做一步小小的变动就搞定了,把代码中的fs.append(f)改成fs.append(f()),输出print(conut()),或者打count()就是一个列表[1 4 9],shell模式输入f1就是1,f2就是4。
分析这个问题俺觉得得先区别两个概念:第一个fs.append(f)和fs.append(f()),是完全不同的两码事,对这个的认知,crossin老师要背锅,因为在编程教室26课和绿色的教材P63教学的“对列表元素的访问”中都没有指出,当列表中的元素为函数时,表达式的写法是不同的,a[1]要改成a[1](),才完成了对元素访问的同时也调用函数得到return的返回值,这个在看了crossin老师分享的这个csdn链接才发现有所不同。
第二个是“函数的定义”与“函数的调用”的区别,当一个函数在定义时,它的定义式中有内部的“局部变量”存在,那这个局部变量就会被设置好,当函数没有局部变量的定义这一操作时,定义完成后直到函数被调用才会将外部变量用到函数内部的表达式中。在这个for循环内部,每一次循环的内容是“定义了一个函数,并将这个函数作为一个元素放进了一个列表中”,当十个函数定义完成后,循环结束,执行下一步也就是return fs操作,返回了一个元素为十个函数的列表,在shell模式里执行f1(),这时才执行了“函数的调用”,那在执行这个函数时,内部没有局部变量,而函数内的表达式会用到变量i,这个变量在顺序运行的前面的程序中有一个外部变量,也就是最后的那个i=3的值,就被函数使用了,于是得到9,在这之前,这些函数一直存放在列表中没有被调用过。
那么为什么改成fs.append(f())就好使了呢,因为在执行这条代码的时候,它表达的物理意义是:“将函数f()的返回值最为一个元素放进列表中”那这一步就有“函数的调用”这一过程,那这一步循环中,这个函数内部也没有局部变量的定义,但他被调用了,他就会使用此时的前面程序中存在的外部变量i=0,于是得到return的返回值1被放进了列表fs[]中,成了第一个元素。以此类推得到一个元素全为数字型数据的列表fs[]。count函数的返回值就能得到元素为[1 4 9]的一个列表。
个人愚见,如有错误,请务必对在下批评指正。 |
|