1.题目:
问以下代码输出结果是什么?
function_list = []
for i in range(5):
def output():
print(i)
function_list.append(output)
# 之后调用
for f in function_list:
f()
2.输出结果
先给出结论
3.结果分析
函数定义时,仅代表output变量指向了一个空间,并不会执行函数体。所以遍历5次,往function_list追加的是5个实现相同功能的函数引用。每次遍历的i并不会作用到函数体里面的print(i).
当遍历function_list的时候,才是真正执行output函数,此时系统中i由于遍历完毕已经等于4了,所以会打印5遍4
4.需求,尽可能少地修改代码,使之分别打印0 1 2 3 4
5. 解题思路
- 考虑到函数定义的时候并不执行函数体的内容,但又需要打印0 1 2 3 4,则考虑在函数定义的时候就得带上i。此时定义函数的时候定义一个缺省参数(关键字参数)i=i,则每次遍历的时候,函数就有参数i传入,成功将函数定义外部的i带入到函数体。
function_list = []
for i in range(5):
def output(i=i):
print(i)
function_list.append(output)
# 之后调用
for f in function_list:
f()