Python 避免可变对象作为函数默认参数

第一篇博客,希望坚持总结、记录的习惯。更希望大佬多多指正以求进步。

python里,可变对象有list,set,dict,即对象id不变但内容可变。

def func(a, l=[]):
    l.append(a)
    print(l)

# 执行两次
func(1)
func(1)

# 输出应该是
[1]
[1]

执行两次func(1),函数和输入参数一样,输出应该是一样的。如果我们是这样的想法,那就进入了陷阱。实际输出是:

[1]

[1, 1]

第一次执行func()的时候,函数实例化了一个空列表并赋值给l,第二次执行的时候并不会再次实例化一个空列表(希望大佬指点。我的理解是 l=[] 这一句只在编译时执行,因此只执行一次),即l已经存储了上次添加的元素,因此再次添加元素后变成[1, 1]。

解决方法

(1)不使用可变对象作为函数默认参数

(2)解决可变对象问题统一的方法——拷贝,具体实现代码如下

def func(a, l=[]):
    lst = copy.copy(l)
    # 也可以使用下面这个方法完成拷贝
    # lst = list(l)
    lst.append(a)
    print(lst)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值