记录一个我和同事在开发过程中遇到的一个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
这样就得到我们期待的结果了,总之踩到这个坑的原因就是我们的基础不够扎实,没有懂得它的运行机制,以致于我们没有正确的使用设置默认值的方式。当你设置的默设置是个变量的时候可要小心啦!设置成变量其实并没有意义。因为------这个变量它其实并不变!