欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > Python函数缺省参数的 “ 坑 ” (与C++对比学习)

Python函数缺省参数的 “ 坑 ” (与C++对比学习)

2025/4/20 0:20:26 来源:https://blog.csdn.net/2302_76941579/article/details/140200055  浏览:    关键词:Python函数缺省参数的 “ 坑 ” (与C++对比学习)

        我们都知道Python函数的缺省参数可以降低我们调用函数的成本,但是一般我们的缺省参数都是不可变对象,如果是可变对象,我们对其多次调用会发生什么呢?

def func(arr=[]):arr.append('Hello')print(arr)func()
func()
func()    

        这貌似很奇怪,因为在学习C++时,打印出来的信息应该都是一致的,如下:

#include <iostream>
#include <vector>
void func(std::vector<int> arr = std::vector<int>())
{arr.push_back(1);for(auto& e : arr){std::cout << e << " ";}std::cout << std::endl;
}
int main()
{func();func();func();return 0;
}

        这是因为在C++中,只有在调用该函数的时候,才会创建对应的缺省参数的对象,所以每次调用都会在栈上创建一个新的vector对象,但是大家一定会观测到每次都地址都是一致的,但是无需担心,因为 arr 的作用域也只是在函数内部,每次调用的时候都是需要重新创建对象的。

void func(std::vector<int> arr = std::vector<int>())
{arr.push_back(1);std::cout << &arr << std::endl;
}

        在Python中,如果你定义了一个函数,并在定义函数参数的时候,为其制定了缺省参数,,那么这个缺省参数就会被维护起来,存储到了函数对象的属性中,直到程序结束或者函数对象被删除。所以我们每次调用的时候,都是在访问同一个缺省参数的对象,因为上面的缺省参数对象是一个可变对象,对其进行append操作就会改变对象的内容,所以就会观测到上面的现象了。

        我们也可以观测一下这个缺省参数对象的地址:

def func(arr=[]):arr.append('Hello')print("id = %d" % (id(arr)))# print(arr)func()
func()
func()

        我们可以观测到对象的id都是一致的,所以也可以证明这几次函数调用的缺省参数对象都是同一个

那如何解决这类问题?

def func(arr=None):if arr is None:arr = []arr.append('Hello')print("id = %d" % (id(arr)))print(arr)func()
func()
func()

        这样设计就没有问题了,因为如果arr是一个空类型None,就会在函数内部重新被赋值成list列表,而此时list列表对象的生命周期和作用域都在函数内,即调用完函数就会被销毁,所以在打印的时候即使id值相同,也是不同对象。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词