python函数默认参数赋值时机

默认参数只会在函数定义时被确定。
对比两个函数
a = [lambda :x for x in range(10)]
. print(a[0]())
. print(a[9]())

b = [lambda n=x:n for x in range(10)]
. print(b[0]())
. print(b[9]())

函数a是一个列表推倒式,for x in range(10), 表示要生成10个lambda函数,a[0]代表生成的第一个函数,a[9]代表生成的第十个函数,a0~9表示调用这些函数。
函数b也是一个列表推导式,同样表示要生成10个lambda函数,a[0]代表生成的第一个函数,a[9]代表生成的第十个函数,a0~9表示调用这些函数。
那么为什么a0,和b0的结果不相同呢?因为lambda函数有所区别,a中的lambda函数没有参数,直接返回x;而b中lambda函数有默认参数,默认参数n=x,并且返回n。
前面说了,都是先利用for x in range(10)生成十个函数(a,b函数的参数不同),再调用函数。a没有参数,a函数结果在每次调用函数时返回,而在生成这十个函数之后x的值已经为9,所以在调用函数时,x的值已经为9,十个函数都是返回9。而b函数参数为默认参数,默认参数只会在函数定义时被确定,所以在进行for循环去生成10个lambda函数时,生成的是10个不同的函数,即lambda n=0~9:n ,所以在调用函数时,自然返回不同的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值