Python 可变参数(mutable variable)默认参数陷阱及讨论

本文探讨了Python中使用可变参数(mutable variable)作为默认参数时出现的陷阱,解释了为何多次调用函数会导致默认参数被意外修改。为避免该问题,建议在定义函数时采用传递空对象的方式初始化默认参数。这种设计源于Python中函数作为一等公民的特性,使得默认参数的行为类似于其他对象的成员变量,其状态会随调用而变化。
摘要由CSDN通过智能技术生成

Python 可变参数(mutable variable)默认参数陷阱及讨论

现象

阅读《Intermediate python》时,遇到一个之前忽略的问题:使用mutable variable作为函数的默认参数,下面是example:

def add_to(v, target=[]):
    target.append(v)
    return target
add_to(1)
add_to(2)
r = add_to(3)
print(r)  # [1, 2, 3]

在上面这个例子中,调用add_to()函数多次,将把1、2、3的结果添加到target中,熟悉其他编程语言的同学可能会同样觉得这与预期结果不符。

为什么会这样?

先简单说明一下为什么会出现这种结果:在python中函数的默认参数在定义时确定,而不是每次调用时初始化值,如果不显示的对默认参数赋值,那么使用的是在编译时确定的对象。下面是Python Common Gotchas中摘录的原因解释:

Python’s default arguments are evaluated once when the function is
defined, not each time the function is called (like it is in say,
Ruby). This means that if you use a mutable default argument and
mutate it, you will and have mutated that object for all future calls
to the

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值