You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:52:16