骏骏的运维小窝

Python中的陷阱

2025/11/18
0
0

可变默认参数

函数定义:

```

def append_to(element, to=[]):

to.append(element)

return to

```

函数调用:

```

print(append_to(10))

print(append_to(20))

```

期望的结果:

每次调用函数时,如果不提供第二个参数,就会创建一个新的列表,所以结果应是这样的:

```

[10]

[20]

```

事实的结果:

当函数被定义时,一个新的列表就被创建一次 ,而且同一个列表在每次成功的调用中都被使用:

```

[10]

[10, 20]

```

结论:

当函数被定义时,Python的默认参数就被创建一次,而不是每次调用函数的时候创建。

这意味着,如果使用一个可变默认参数并改变了它,将会在未来所有对此函数的调用中改变这个对象。

应该使用的方法:

在每次函数调用中,通过使用指示没有提供参数的默认参数(None通常是个好选择),来创建一个新的对象:

```

def append_to(element, to=None):

if to is None:

to = []

to.append(element)

return to

```