MST

星途 面试题库

面试题:Python函数可选实参的默认值陷阱及避免方法

在Python函数中,使用可变对象(如列表、字典)作为可选实参的默认值时,可能会出现什么问题?请举例说明,并阐述如何避免这种问题。
23.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
  1. 问题
    • 当使用可变对象(如列表、字典)作为可选实参的默认值时,默认值会在函数定义时被创建,并且在后续调用中如果对其进行修改,会影响到下一次调用。这是因为默认值是共享的,而不是每次调用函数时都重新创建。
  2. 举例说明
def append_to_list(item, my_list=[]):
    my_list.append(item)
    return my_list


list1 = append_to_list(1)
list2 = append_to_list(2)
print(list1)  
print(list2)  

在上述代码中,预期 list1[1]list2[2],但实际输出为:

[1, 2]
[1, 2]

这是因为 my_list 在函数定义时就创建了,list1list2 操作的是同一个列表对象。 3. 避免方法

  • 在函数内部检查默认值是否为初始状态,如果是则创建一个新的可变对象。
def append_to_list(item, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(item)
    return my_list


list1 = append_to_list(1)
list2 = append_to_list(2)
print(list1)  
print(list2)  

此时输出为:

[1]
[2]

这样每次当 my_listNone 时,都会创建一个新的列表,避免了共享默认值带来的问题。