Python:默认参数是字典或者列表时需要注意的坑

本文探讨了Python中默认参数为可变类型(如列表或字典)时可能导致的问题。当默认参数在函数定义时仅初始化一次,后续函数调用中修改默认参数将影响所有调用。通过示例展示了这种行为,并提出了确保每次调用独立不受影响的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天写代码Pycharm给了一条inspection

Default argument value is mutable

This inspection detects when a mutable value as list or dictionary is detected in a default value for an argument.

Default argument values are evaluated only once at function definition time,which means that modifying the default value of the argument will affect all subsequent

大致意思就是如果你的默认参数是列表或者字典,这个默认参数仅在初始化的时候被实现一次,而且仅此一次,如果后面的函数调用改变了这个默认参数,可能会影响到以后的这个参数。

啥意思呢?

看个例子吧

def add_end(arr = []):
    arr.append('end')
    print(id(arr), arr)

if __name__ == "__main__":
    add_end()
    add_end()
    add_end(arr = ['begin'])

2135770030664 ['end']
2135770030664 ['end', 'end']
2135770030728 ['begin', 'end']

上面这个代码说的很清楚,arr这个默认参数本来是一个空数组,前两次都是默认调用实现,因此arr的地址都是一个,直接append('end')就好,但是后面的调用改变了默认参数,变成了自己实现的,这样的话默认参数就会改变,因此地址也变了。

 

如何做到每次调用都能不受之前调用的影响呢?可以参考下面的实现

def add_end(arr = None):
    if arr == None:
        arr = []
        arr.append('end')
    print(id(arr), arr)

if __name__ == "__main__":
    add_end()
    add_end()
    add_end(arr = ['begin'])

2056900272712 ['end']
2056900272712 ['end']
2056900272712 ['begin']

上面这段代码清楚的说明了,每次调用都是独立的,不受其他调用的影响

比较好奇的是,为什么三次的地址都是一样的?可能这是Python默认的机制吧,默认参数和实际参数都是一样的地址,每次调用地址并不变,修改里面的内容就好,以上是本人愚见,如果有大神有其他想法可以指出,欢迎多多交流,谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值