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

Python与JavaScript默认参数行为差异原因探究

Python与JavaScript默认参数表现差异的原因分析

在研究Python与JavaScript的编程问题时,发现二者虽同属解释型语言,但默认参数的表现却截然不同。以下是对应的代码及输出,请问造成这种差异的原因是什么?

Python代码及输出

def func(a = list()):
    a.append(len(a))
    return a

print(func())
print(func())

输出:

[0]
[0,1]

JavaScript代码及输出

function func(a = []) {
    a.push(a.length); 
    return a
}

console.log(func())
console.log(func())

输出:

[0]
[0]

差异核心原因:默认参数的求值时机不同

  • Python的默认参数求值时机:Python的默认参数是在函数定义阶段就完成计算并创建对象的。对于list()这种可变对象,只会被实例化一次,之后每次调用函数且未传入对应参数时,都会复用这个预先创建好的对象。
    第一次调用func()时,向初始空列表添加0,得到[0];第二次调用时,还是操作同一个列表,添加当前长度1,最终得到[0,1]。

  • JavaScript的默认参数求值时机:JavaScript的默认参数是在函数每次被调用时才进行求值的。也就是说,每次调用func()且未传入参数时,都会重新创建一个全新的空数组[],两次调用操作的是完全独立的数组对象,因此两次输出都是[0]。

补充:Python中规避可变默认参数问题的常用写法

如果想让Python的表现和JavaScript一致,每次调用都创建新的可变对象,可以用None作为默认值,在函数内部初始化:

def func(a=None):
    if a is None:
        a = []
    a.append(len(a))
    return a

print(func())  # 输出 [0]
print(func())  # 输出 [0]

内容的提问来源于stack exchange,提问作者Ankur Paranjpe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:29:57