记录一道python装饰器相关的题目

本文探讨了Python中关于函数闭包和默认参数的一个常见陷阱,通过一个具体的代码示例展示了如何导致意外的输出。在初始代码中,一个for循环创建了一个函数列表,每个函数都引用了循环变量i。然而,当函数被调用时,它们都打印出最终的i值,即4。为了解决这个问题,提出了修改方案,即在函数定义时使用默认参数i=i,确保每个函数都有自己的i副本。这样做后,调用函数列表时将正确打印0到4。
摘要由CSDN通过智能技术生成

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()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值