Python语句中使用eval执行原地操作时如何获取返回值?
问题核心
list.append()属于原地修改方法,Python中所有原地修改容器的方法默认返回None,因此eval('[1,2].append(3)')实际得到的是None,自然无法和列表做拼接操作。
解决方案
方案1:用非原地的列表拼接(最推荐)
如果没有强制必须调用append的要求,直接在eval内用列表相加即可,该操作会直接返回新列表:
["a", "b"] + eval('[1, 2] + [3]')
运行结果为['a', 'b', 1, 2, 3],完全符合预期。
方案2:必须调用append时显式返回修改后的列表
如果你的使用场景要求必须在eval内执行append操作,可以通过表达式语法让eval返回修改后的列表本身:
- Python 3.8及以上版本(支持海象运算符):
["a", "b"] + eval('(tmp := [1,2], tmp.append(3), tmp)[-1]')
原理是利用逗号表达式生成元组,最后一个元素为执行完append的列表,取最后一位即可拿到目标列表。
- 兼容所有Python版本:
可以用匿名函数封装逻辑:
["a", "b"] + eval('(lambda tmp=[1,2]: (tmp.append(3), tmp)[1])()')
方案3:使用其他生成新列表的操作
也可以用list.copy后拼接、itertools.chain等方式实现,示例:
["a", "b"] + eval('list([1,2]) + [3]')
内容的提问来源于stack exchange,提问作者amiref
相关产品推荐
相关产品推荐

