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
相关产品推荐
相关产品推荐

