Python Lambda表达式访问嵌套类成员报错问题求助
问题解答:reduce中Lambda引用嵌套类成员报错的原因与解决方法
错误原因
你没搞清楚reduce的执行逻辑:
- 第一次调用Lambda时,
a是列表第一个元素(A类实例),b是第二个元素(A类实例),计算后返回1+5=6(整数类型); - 第二次调用Lambda时,
a变成了这个整数6,b是列表第三个元素(A类实例),此时访问a.b.length必然报错——整数根本没有b属性。
解决方法
最简洁且符合逻辑的写法是给reduce指定初始值0,让累加的初始状态和每次计算结果都保持整数类型:
from functools import reduce class B : def __init__(self, n) : self.length = n class A : def __init__(self, n) : self.b = B(n) myList = [A(1), A(5), A(7)] print(myList[0].b.length) # 修改后的reduce调用 print(reduce(lambda total, item: total + item.b.length, myList, 0))
执行后会输出1和13,完全符合你累加数值的需求。
补充说明
如果坚持不指定初始值,也可以通过判断参数类型来兼容,但这种写法冗余且可读性差,不推荐:
print(reduce(lambda a, b: a + b.b.length if isinstance(a, int) else a.b.length + b.b.length, myList))
内容的提问来源于stack exchange,提问作者Tarthalion
相关产品推荐
相关产品推荐

