python中默认参数必须指为不变对象(多次调用实例以及演示)

本文通过两个具体的Python函数示例,深入浅出地解析了使用可变对象作为函数默认参数时可能遇到的问题,并提出了解决方案。

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

编译器为visual code

def asd(L=[]):
    L.append('END')
    return L
asd()
asd()
print(asd())

#输出为 ['END', 'END', 'END']
def asf(K=[]):
    K.append('END')
    return K
asf(['2','4'])
asf(['2','4'])
print(asf(['2,','4']))

#输出为 ['2,', '4', 'END']

先看第一段

def asd(L=[]):                        #先定义一个函数,传入一个list
    L.append('END')                   #添加一个END
    return L                          #返回
asd()                                 #第一次调用  
asd()                                 #第二次调用
print(asd())                          #输出第三次调用的内容,print的()中asd()实际是第三次调用

#输出为 ['END', 'END', 'END']

第一次调用时结果为

['END']

第二次调用时结果为

['END','END']

第二段为L赋值后调用(不是默认参数,赋值了)

def asf(K=[]):
    K.append('END')
    return K
asf(['2','4'])
asf(['2','4'])
print(asf(['2,','4']))

#输出为 ['2,', '4', 'END']
所以结果
 ['2,', '4', 'END']

在定义asd()的时候,默认参数L的值已经有了,即 []。而 L也是一个变量,它指向对象[],每次调用该函数时,如果改变L的值,则下次调用时,默认参数的值就变了,就不再是函数定义时的[]了。

为了结束这个问题,我们可以为L设置一个不变对象null来解决

def asd(L=null):                   """
    if L is null:                  为L设置一个 null 这个不变对象 
       L=[]
    L.append('END')                """
    return L
asd()
asd()
print(asd())

#输出为 ['END']

这样,无论调用多少次,其结果都是一样的

设置不变对象后,对象内部的数据就不能更改了。所以就减少了由于数据的修改而导致的错误。

能设置成一个不变对象,就尽量设置不变对象,以免日后的bug。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值