python参数设置默认值为变量的一个超级大坑

记录一个我和同事在开发过程中遇到的一个python基础的坑,这个坑导致我和同事debug了好久才找到问题。过了一段时间后,另一个同事再次踩坑,并且影响了线上的服务,血淋淋的教训。基础扎实的重要性就体现出来了。
在python编程过程中,为了方便,我们常常在定义函数的时候为函数的参数设置默认值,希望在每次调用这个函数且不为参数传值的时候使用此默认值。然而下面这段代码的运行结果并不符合我们的预期。

import time
a = time.time()

def show_time(current_time=time.strftime('%Y-%m-%d %H%:%M:%S', time.localtime(time.time()))):
    print(current_time)

show_time()
time.sleep(2)
show_time()

show_time()函数用来获取当前时间,我们采用了为函数参数设置默认值的方式,希望每次调用以后都能得到当前的时间。在两次调用show_time()之间延时了两秒钟。我们希望得到的结果是这样的:

2019-12-24 10:19:52
2019-12-24 10:19:54

然而实际运行结果是这样的:

2019-12-24 10:19:52
2019-12-24 10:19:52

可以看到两次调用得到的时间是一样的,并不是我们所期望的那样。

下面我们再来看一下下面这段代码:

b = 1

def test(c=b+1):
    print(c)

test()
b = 2
test()

我们以为运行结果是这样的:

2
3

然而运行结果是这样的:

2
2

究其原因,原来是这个函数的默认值只在函数被加载时调用一次,之后若不传值则一直都会用加载函数时候设置的值,此值不会再改变。若这个默认值我们设置的是个常量并不会对我们对程序有什么影响,若是个变量,那可就要小心啦!是个变量最后还是当成了常量使用。
那么为了实现符合我们预期对要求,我们就只能像下面这样使用啦。大家都能想到,也就是在函数内部为变量赋值。

import time
a = time.time()

def show_time(current_time=None):
    current_time = time.strftime('%Y-%m-%d %H%:%M:%S', time.localtime(time.time()))
    print(current_time)

show_time()
time.sleep(2)
show_time()

程序运行结果如下:

2019-12-24 10:38:22
2019-12-24 10:38:24

这样就得到我们期待的结果了,总之踩到这个坑的原因就是我们的基础不够扎实,没有懂得它的运行机制,以致于我们没有正确的使用设置默认值的方式。当你设置的默设置是个变量的时候可要小心啦!设置成变量其实并没有意义。因为------这个变量它其实并不变!

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

河北小博博

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值