0
点赞
收藏
分享

微信扫一扫

Python可变默认参数的陷阱

德州spark 2024-04-10 阅读 14

image.png

在上面这个例子中,我们会发现,第二次调用函数的时候,默认参数不再是空列表了,而是上一次调用之后那个有内容的列表。这是为什么呢?

实际上,函数并创建之后,这个函数对象其实就会有一个属性叫做__defaults__,这是一个元组,里面存放着函数的默认参数值对象。我们可以打印出来看一下: image.png

可以看到,在调用函数之前,__defaults__中的空列表对象就已经存在了。default_list是个变量引用,默认情况下是指向这个__defaults__中的对象的,而default_list.append(1)改变了这个列表对象。第二次调用func的时候,由于未给函数传参,default_list仍然指向__defaults__中的这个列表对象,所以才会有以上的效果。

那么如何解决这个可变默认参数的陷阱呢?一般方法是把可变默认参数设为None,实现如下:

image.png

在这个例子中,__defaults__中的默认参数对象始终都是None, default_list = []这行代码不过只是在另一块内存中新建了一个列表然后让这个变量引用指向新列表,再修改列表,就和原来的__defaults__中的默认参数无关了。

举报

相关推荐

0 条评论