Default argument value is mutable
时间: 2024-03-20 17:40:40 浏览: 11
在 Python 中,当我们在函数定义中使用可变对象(例如列表或字典)作为默认参数时,可能会遇到一个陷阱:默认参数只在函数定义时计算一次,而不是每次函数调用时都计算。这可能会导致意外的行为,例如在函数中修改默认参数的值,会影响到下一次函数调用。
例如,考虑以下代码:
```python
def append_to_list(value, my_list=[]):
my_list.append(value)
return my_list
result1 = append_to_list(1)
print(result1) # 输出 [1]
result2 = append_to_list(2)
print(result2) # 输出 [1, 2]
```
在这个例子中,我们定义了一个函数 `append_to_list`,它接受一个值和一个列表作为参数。如果没有传递列表参数,函数将使用一个默认的空列表。然后,函数将值添加到列表中,并返回新的列表。
在第一次调用 `append_to_list` 时,我们传递了一个值 `1`,但是没有传递列表参数,因此函数使用默认列表。函数将值 `1` 添加到列表中,然后返回 `[1]`。
在第二次调用 `append_to_list` 时,我们传递了一个值 `2`,但是没有传递列表参数,因此函数将再次使用默认列表。但是,这个默认列表已经被修改过了,之前的调用添加了值 `1`,因此第二个调用将值 `2` 添加到 `[1]` 中,返回 `[1, 2]`。
为了避免这个问题,可以将默认参数设置为不可变的对象,例如 `None`,然后在函数内部创建一个新的可变对象。例如:
```python
def append_to_list(value, my_list=None):
if my_list is None:
my_list = []
my_list.append(value)
return my_list
result1 = append_to_list(1)
print(result1) # 输出 [1]
result2 = append_to_list(2)
print(result2) # 输出 [2]
```
在这个例子中,我们将默认列表设置为 `None`,然后在函数内部检查传递的列表是否为 `None`,如果是,则创建一个新的空列表。这样,每次函数调用时都会创建一个新的列表,而不是使用默认列表。