Python中传递列表并将其长度设为默认参数报错的解决方法
解决Python函数默认参数引用函数参数的问题
哦,这个坑我踩过!你的函数写法有两个关键问题,咱们一个个说清楚,再给你可行的实现方案:
为什么原来的写法会报错?
- 默认参数求值时机不对:Python的函数默认参数是在函数定义阶段就计算好的,不是调用的时候。你写
nind=indel.length时,函数定义时indel还没被传入(甚至都没定义),直接就会抛出NameError。 - 列表没有
.length属性:原生列表对象没有.length这个属性,要获取列表长度得用内置函数len(indel)。
可行的实现方式
最常用也最稳妥的方案是把默认参数设为None,然后在函数内部判断并赋值:
针对原生列表的情况
def func(indel, nind=None): # 如果用户没传nind,就用传入的indel的长度 if nind is None: nind = len(indel) # 这里写你的业务逻辑 print(f"indel长度是{nind}")
测试一下:
my_list = [1,2,3,4] func(my_list) # 输出:indel长度是4 func(my_list, 10) # 输出:indel长度是10
如果indel是自定义类实例(有.length属性)
如果你的indel不是原生列表,而是一个自定义类的实例,且这个类确实有.length属性,只需要把len(indel)换成indel.length就行:
def func(indel, nind=None): if nind is None: nind = indel.length # do something
额外提醒
千万不要用可变对象(比如列表、字典)作为默认参数,这也是Python里常见的坑——因为默认参数在定义时就创建了,后续调用会复用同一个对象,导致意外的行为。咱们上面用None的方案就完美避开了这个问题。
内容的提问来源于stack exchange,提问作者user8210645
相关产品推荐
相关产品推荐

