考虑以下交际密码:
from sympy import Add
from sympy.abc import x
t1 = 2+2*x
t2 = x
myeq = sp.UnevaluatedExpr(Add(sp.UnevaluatedExpr(t1), sp.UnevaluatedExpr(t2), evaluate=False))
# BUG! Will print: x + 2*x + 2
# Yet it should print: 2+2*x+x
print(myeq)
此代码段改编自this答案。那里的条款比较简单,所以Add
保留了这个命令。但是,如何在这种情况下让Add
保持秩序呢?
(备注:如果我们将条款更改为t1=x
和t2=x**2
我的方法使用sp.UnevaluatedExpr
作品,但没有这些条款的原始答案没有。唉,对于我的具体情况,甚至没有使用sp.UnevaluatedExpr
作品。)
......但更多的缺失功能。所有这些都记录在案。
这就是unevaluated所说的SymPy。
未评估意味着它内部的值不会与其外部的表达式相互作用以提供简化的输出。
在您的示例中,术语2*x
和x
未按预期进行简化。
你所看到的是SymPy没有保留你输入你的条款的顺序。这是documented under the expression tree section。
交换操作
Add
和Mul
的参数以任意(但一致!)的顺序存储,该顺序与输入的顺序无关。
这应该不是问题,因为Add
和Mul
是可交换的。
虽然,如果由于某种原因你想保留由于乘法的非交换性而导致的输入顺序,你可以这样做。
在SymPy中,您可以使用
Symbol('A', commutative=False)
创建非交换符号,非交换符号的乘法顺序与输入保持相同)
至于现在,似乎没有非交换性的加法。