面试题答案
一键面试- 问题:
- 当使用可变对象(如列表、字典)作为可选实参的默认值时,默认值会在函数定义时被创建,并且在后续调用中如果对其进行修改,会影响到下一次调用。这是因为默认值是共享的,而不是每次调用函数时都重新创建。
- 举例说明:
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
在函数定义时就创建了,list1
和 list2
操作的是同一个列表对象。
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_list
为 None
时,都会创建一个新的列表,避免了共享默认值带来的问题。