Sympy中parse_expr解析的表达式subs求值异常问题咨询
问题原因
你遇到的问题是因为parse_expr默认创建的是普通Symbol类型变量,而你直接写x | y时使用的是BooleanVar(布尔符号),两者属于不同的SymPy对象类型。当你用之前定义的BooleanVar变量传入subs()时,无法匹配parse_expr生成的Symbol变量,导致只有部分变量被替换,最终表达式简化为x。
解决方法
以下几种方式都能解决这个问题:
1. 使用字符串作为subs的键
直接通过变量名称字符串来替换,SymPy会自动匹配表达式中对应名称的变量:
exp = parse_expr('(y | x)') result = exp.subs({'x': True, 'y': False}) print(result) # 输出True
2. 传入预定义的布尔变量给parse_expr
提前定义BooleanVar类型的变量,通过local_dict参数告诉parse_expr使用这些变量,避免创建新的Symbol:
from sympy.logic.boolalg import BooleanVar from sympy import parse_expr x = BooleanVar('x') y = BooleanVar('y') exp = parse_expr('(y | x)', local_dict={'x': x, 'y': y}) result = exp.subs({x: True, y: False}) print(result) # 输出True
3. 用simplify强制化简结果
如果已经得到未完全求值的表达式,可以用simplify()强制完成逻辑运算:
from sympy import parse_expr, simplify exp = parse_expr('(y | x)') result = simplify(exp.subs({'x': True, 'y': False})) print(result) # 输出True
内容的提问来源于stack exchange,提问作者Scratcha
相关产品推荐
相关产品推荐

