Python3 map返回NoneType列表而非修改后的自定义类对象如何解决?
问题原因
你定义的incr_number实例方法是原地修改对象属性的副作用方法,没有显式设置返回值,Python中所有无return的函数/方法默认返回None。你当前写的lambda x: x.incr_number(1)会直接把方法的返回值(也就是None)作为map的映射结果,所以强转list后得到的全是None。
解决方案
1. 改造map写法直接返回修改后的对象列表
只需要修改lambda表达式,执行完方法调用后返回对象本身即可,两种常用写法:
# 写法1:用元组取值,先执行方法,再取第二个元素也就是对象本身,可读性更强 obj_list_2 = list(map(lambda x: (x.incr_number(1), x)[1], obj_list_2)) # 写法2:利用or运算符的短路特性,None会判定为假,最终返回x obj_list_2 = list(map(lambda x: x.incr_number(1) or x, obj_list_2))
执行完上述代码后,obj_list_2就是修改后的MyThing实例列表,符合你的预期输出。
2. 其他单行批量调用方案
列表推导式(更符合Python常用写法)
如果不需要接收返回的新列表,只是要批量执行方法,直接写:
[obj.incr_number(1) for obj in obj_list_2]
如果需要同时得到修改后的对象列表,调整为:
obj_list_2 = [ (obj.incr_number(1), obj)[1] for obj in obj_list_2 ]
补充说明
从Python最佳实践角度,如果你只是要对列表内元素执行带副作用的操作(比如原地修改属性),普通的for循环可读性最高,不需要刻意追求单行写法。map和列表推导式的设计初衷是做值转换,用来执行副作用属于非典型用法。
内容的提问来源于stack exchange,提问作者DJL
相关产品推荐
相关产品推荐

