- 可变对象作为默认值的陷阱:
- 当使用可变对象(如列表、字典)作为函数参数的默认值时,默认值会在函数定义时被初始化一次,而不是每次调用函数时都重新初始化。
- 例如:
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)
- 在上述代码中,
my_list
是一个列表,作为默认参数。由于它只初始化一次,后续调用append_to_list
函数时,my_list
是同一个对象。所以list1
和list2
会包含所有添加的元素。
- 作用域相关的陷阱:
- 如果在函数定义时,默认值依赖于外部作用域的变量,且该变量在函数定义后被修改,可能会出现意外结果。
- 例如:
x = 10
def print_value(val = x):
print(val)
x = 20
print_value()
- 这里在定义
print_value
函数时,val
的默认值是x
,此时x
的值为10。尽管之后x
的值被修改为20,但函数默认值已经确定为10,所以print_value()
会输出10。