Python学习之路(38)——可变对象作为函数默认参数值会怎样?

我们知道函数有默认参数,如果使用可变对象(例如list、dict等)作为函数的默认参数,会怎样?

首先我们看一个例子:

>>>def function(date = []):
...        date.append('a')
...        return date


>>>function()
['a']
>>>function()
['a', 'a']
>>>function()
['a', 'a', 'a']
......

  

很明显,我们的最初想法是,无论我们不输入date参数调用function函数多少次,结果都应该是字符串'a'被分配到一个king的list里。但是很明显,最终这个结果不是我们想要的。

 

在Python里,函数的默认值是在函数的定义时实例化的,而不是调用时。

当且仅当默认参数所在的“def”语句执行的时候,默认值才会进行计算。“def”是Python的可执行语句,默认参数在“def”的语句环境里被计算。如果执行多次“def”语句,每次都会创建一个新的参数对象。

为什么调用函数的时候,这个默认值却被赋予了不同的值呢?

因为在每次给函数指定一个默认值的时候,Python都会存储这个值。如果在调用函数的时候重写了默认值,那么这个存储的值就不会被使用。当不重写默认值的时候,那么Python就会让默认值引用存储的值。

 

那么正确的代码是怎么样的呢?

>>>def function(date = None):
...        if date is None:
...            date = []
...            date.append('a')
...        return date


>>>function()
['a']
>>>function()
['a']
>>>function()
['a']
......

  

再看一个例子:

>>> def foo(count = 0):
	count += 1
	return count

>>> foo()
1
>>> foo()
1
>>> foo(2)
3
>>> foo(3)
4
>>> foo(4)
5
>>> foo()
1

  

这里,默认值是整型类型,整型是一种不可变的变量,与列表list不同,在执行函数过程中,整型变量是不能被改变的。当执行count += 1这个语句的时候,实际上并没有改变count这个变量原有的值,而是让count指向了不同的值

但是在执行date.append('a')时,确是实实在在的改变了原有的list,因此才会出现这样的差异。

posted on 2018-03-19 10:59  nicolas_Z  阅读(201)  评论(0)    收藏  举报

导航