简单粗暴上代码:
def fun(a, b=[]): b += [a] print(b) fun(1) fun(2,[]) fun(3)是不是看上去很简单,其实暗藏玄机,请大家看一下输出结果,是不是有点让你疑惑^^~
[1] [2] [1, 3]此时你是否也和我有一样的疑惑,为什么 fun(3) 的输出结果是 [1, 3]? 哈哈,不卖关子了,这里是因为,因为函数被定义好后,只会生成一次,所以在函数生成的时候定义的变量 b 的默认值也只会被初始化一次。
因此,当执行fun(1)函数时,没有给 b 传参,所以使用的是 b 的默认值,此时 b 的默认值为[1]。 执行fun(2,[])时,给 b 传了一个[]值(恰好和默认值相同,其实是不同的数据),因此便使用的是传入数据,执行结果便是[2]。 然后在执行fun(3),此刻又没有给 b 传参,所以依旧使用的是 b 的默认值, 而 b 的默认值只会随着函数的生成被生成一次 ( fun(1) 生成过了 ),所以现在的默认值是fun(1)的执行结果[1],因此当fun(3)再次调用时,输出结果便会是[1, 3]。
如果不行出现当前这种情况,而是在函数每次被调用的时候都初始化一次变量,可以用下面这种写法:
def function(a, b=None): b = b if b else [] # 明确每次重新定义b b += [a] print(b) function(1) function(2, []) function(3)输出结果:
[1] [2] [3]