MST

星途 面试题库

面试题:Python函数默认参数与可变参数的潜在陷阱

请分析以下Python代码运行的结果及原因: ```python def func(lst = []): lst.append(1) return lst result1 = func() result2 = func() print(result1) print(result2) ``` 然后,修改代码使其符合预期,即每次调用`func`函数都返回一个只包含`1`的新列表。同时,阐述默认参数在这种情况下可能带来的潜在问题,以及如何避免这些问题。
14.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

运行结果及原因

  1. 运行结果
    [1, 1]
    [1, 1]
    
  2. 原因:在Python中,函数的默认参数在函数定义时就被初始化,并且只会初始化一次。对于func(lst = []),这里的[]在函数定义时就创建好了,后续每次调用函数如果不传入新的lst,都会使用这个初始化好的列表。所以每次调用func时,都会在这个共享的列表上进行append操作,导致result1result2指向的是同一个列表,结果都是[1, 1]

修改后的代码

def func(lst=None):
    if lst is None:
        lst = []
    lst.append(1)
    return lst

result1 = func()
result2 = func()
print(result1)
print(result2)

默认参数潜在问题及避免方法

  1. 潜在问题:如上述代码最初版本展示的,默认参数如果是可变对象(如列表、字典),会因为共享对象导致意外的结果,违背函数独立调用的预期。
  2. 避免方法:像修改后的代码那样,将默认参数设置为None,在函数内部检查参数是否为None,如果是则创建一个新的可变对象。这样每次调用函数时,如果没有传入参数,都会创建一个新的对象,避免了共享对象带来的问题。