Python学习注意点-函数默认值

来源:互联网 发布:java有什么用处 编辑:程序博客网 时间:2024/05/17 21:37

在Python2.x中,函数参数中的默认值是在定义的时候就已经计算出来了,也就是说该默认参数只会初始化一次,以后每次调用的默认参数都是同一个,具体可以参考Python官网文档-函数默认值由于这个特点,在定义函数默认值的时候,如果参数是可变对象,那么该参数的默认值在定义的地方需要定义成None,同时在函数实现内部进行特殊处理。否则,会由于上一次的值而导致并不是预期的结果

以下是官网的两个例子:

>>> i = 5>>> def f(arg = i):...   print arg... >>> i = 6>>> f()5

上面例子中函数的本来含义是函数参数的默认值和变量i的保持一直,但是在修改i的值之后还是原第一次i的值。

>>> def f2(a, L=[]):...   L.append(a)...   return L... >>> print f2(1)[1]>>> print f2(2)[1, 2]>>> print f2(3)[1, 2, 3]
上面例子中由于上一次调用改变了默认值,导致后面使用时列表中包含了上次的元素。

以下是我自己测试的例子:

>>> def get_default():...   print 'get_default called!'...   return []... >>> def f3(a, L=get_default()):...   L.append(a)...   return L... get_default called!>>> f3(1)[1]>>> f3(2)[1, 2]>>> f3(3)[1, 2, 3]>>> 
可以看到在函数定义的时候获取默认值的方法就被调用了。
正确的写法应该是:

>>> def f4(a, L=None):...   if L is None:...     L = []...   L.append(a)...   return L... >>> print f4(1)[1]>>> print f4(2)[2]>>> print f4(3)[3]

常见的比如使用当前时间戳time.time():

错误的写法:

>>> import time>>> def time_cost(start, end=time.time()):...   print 'time cost: %f' % (end - start)... >>> start = time.time()>>> time_cost(start)time cost: -5.835118>>> time_cost(start)time cost: -5.835118
正确的写法:

>>> import time>>> def time_cost(start, end=None):...   if end is None:...     end = time.time()...   print 'time cost: %f' % (end - start)... >>> start = time.time()>>> time_cost(start)time cost: 7.265897>>> time_cost(start)time cost: 9.630550





0 0
原创粉丝点击