面试题答案
一键面试运行结果及原因
- 运行结果:
[1, 1] [1, 1]
- 原因:在Python中,函数的默认参数在函数定义时就被初始化,并且只会初始化一次。对于
func(lst = [])
,这里的[]
在函数定义时就创建好了,后续每次调用函数如果不传入新的lst
,都会使用这个初始化好的列表。所以每次调用func
时,都会在这个共享的列表上进行append
操作,导致result1
和result2
指向的是同一个列表,结果都是[1, 1]
。
修改后的代码
def func(lst=None):
if lst is None:
lst = []
lst.append(1)
return lst
result1 = func()
result2 = func()
print(result1)
print(result2)
默认参数潜在问题及避免方法
- 潜在问题:如上述代码最初版本展示的,默认参数如果是可变对象(如列表、字典),会因为共享对象导致意外的结果,违背函数独立调用的预期。
- 避免方法:像修改后的代码那样,将默认参数设置为
None
,在函数内部检查参数是否为None
,如果是则创建一个新的可变对象。这样每次调用函数时,如果没有传入参数,都会创建一个新的对象,避免了共享对象带来的问题。