如何阻止Sympy自动计算布尔表达式,保留符号关系待后续替换求值
SymPy 表达式
x == [] 直接返回False的原因与解决方案 根因说明
- SymPy的符号运算体系仅对自身定义的代数类型生效,Python原生的
list等容器不属于SymPy的符号类型范畴 - 执行
sympy.sympify("x == []")时,Python会优先触发原生==比较逻辑:符号x是SymPy内置的Basic子类实例,和原生列表属于完全不同的类型,Python默认不同类型的实例做==比较直接返回False,不会生成SymPy的Eq符号等式对象 - 数值类表达式如
x + 1可以生成符号表达式,是因为+运算符已经被SymPy重写,遇到符号对象时会自动构造Add表达式,和比较运算的处理逻辑完全不同
实现预期效果的方案
方案1:显式构造Eq表达式(推荐)
先将空列表包装为SymPy可识别的符号对象,再用Eq构造等式:
import sympy x = sympy.Symbol('x') # 将空列表定义为SymPy符号常量 empty_list = sympy.Symbol('[]') expr = sympy.Eq(x, empty_list) # 输出验证 print(expr) # 输出 x == [] print(expr.subs({x: empty_list})) # 代入后输出 True
方案2:直接通过字符串生成
使用Eq编写表达式字符串,调用sympify时传入evaluate=False关闭自动求值:
import sympy expr = sympy.sympify("Eq(x, [])", evaluate=False) # 输出验证 print(expr) # 输出 Eq(x, []) print(expr.subs({"x": []})) # 代入后输出 True
内容的提问来源于stack exchange,提问作者Monsieur AZERTY
相关产品推荐
相关产品推荐

