SymPy中结构一致的表达式使用==比较返回False的问题求解
问题原因
你构造by_hand时的f是Symbol类型,通过sp.Function(f)生成的函数实例,和sympify('f(x)')默认创建的Function实例身份不一致,这是==比较返回False的核心原因。你之前传入locals={'f':f}不生效,也是因为传入的f是Symbol类型,和sympify解析需要的Function类型不匹配。
解决方案(按适用场景排序)
1. 单元测试场景最便捷方案:直接比较srepr输出
SymPy的srepr会完整序列化表达式的所有结构信息,你已经验证过两个表达式的srepr完全相等,直接在单元测试里断言srepr相等即可,不需要修改原有业务代码,也不需要额外传locals参数:
assert sp.srepr(by_hand) == sp.srepr(from_string)
该方法对批量测试用例兼容性最高,完全规避符号标识不一致的问题
2. 从构造逻辑根上解决:统一定义函数类型
如果后续需要频繁做表达式比较,建议直接将f定义为Function类型而非Symbol类型,再配合locals参数传入sympify,就能直接用==比较:
import sympy as sp # 直接定义Function类型的f,不要先定义Symbol再转 f = sp.Function('f') x = sp.Symbol('x') by_hand = f(x) from_string = sp.sympify('f(x)', locals={'f': f}) print(by_hand == from_string) # 输出True
3. 不需要改构造逻辑的动态比较方案:使用内置测试工具
如果不想改原有构造逻辑,也可以使用SymPy自带的测试断言工具(SymPy 1.7+版本支持),会自动忽略标识差异比较表达式结构:
from sympy.testing import assert_equal assert_equal(by_hand, from_string)
内容的提问来源于stack exchange,提问作者Pillsy
相关产品推荐
相关产品推荐

