Python中函数数组参数在多次调用间的存储位置及引用问询
Python函数默认参数的引用维护与符号表查询
一、两次调用间数组引用的维护逻辑
Python中函数的默认参数是在函数定义阶段就完成初始化的,而非每次调用函数时重新创建。对于列表这类可变对象来说,默认参数绑定的是该对象的内存引用,不是对象的副本。
以你提供的代码为例:
def scopeUnderstanding2(a, myArray=[]): print(f"myArray in func scopeUnderstanding2 myArray : {myArray}") myArray.append(a) print(f"myArray in func after .append(a) myArray : {myArray}") print(scopeUnderstanding2(1)) print(scopeUnderstanding2(2))
首次调用scopeUnderstanding2(1)时,因为未传入myArray参数,会使用定义时初始化的空列表[],执行append(1)后,这个列表对象被修改为[1]。
二次调用scopeUnderstanding2(2)时,依然复用同一个列表对象的引用(默认参数不会重新初始化),所以初始的myArray就是[1],执行append(2)后变成[1,2]。
这就是两次调用间数组值被保留的核心原因——本质是同一个可变对象被多次修改。
二、查看两次调用间对象值的符号表方法
Python提供了多种方式查看符号表和对象引用状态:
- 函数的
__defaults__属性:函数的默认参数值会存储在这个元组中,直接打印就能查看默认参数的当前状态:print(scopeUnderstanding2.__defaults__) # 首次调用后输出:([1],);二次调用后输出:([1,2],) locals()与globals()函数:在函数内部调用locals()可查看当前局部作用域的符号表,globals()用于查看全局作用域的符号表。比如在函数内添加print(locals()),就能看到myArray的引用和对应值。dir()函数:可查看当前命名空间中的所有名称,结合getattr()能获取对应对象的具体值。
内容的提问来源于stack exchange,提问作者rick stag
相关产品推荐
相关产品推荐

