我目前正在开发一种微分运算符sympy,可以将其以矩阵形式放置。在这种情况下,args创建Mul对象时列表的顺序非常重要,以确保仅在需要时才执行区分。
sympy
args
Mul
问题是,完成以下操作后:
input = (t,z,x) Mul(*input).args
(t, x, z)之所以返回,是因为进行了一些重排args。如何避免args被排序?
(t, x, z)
为什么arg的顺序对正确来说很重要?
防止这种情况的唯一方法是将符号设置为不可交换的(x = Symbol('x', commutative=False))。SymPy对象通过比较进行比较args,因此x*y*z == y*x*z要正常工作,必须对args进行规范排序。有一些尝试使此工作在不进行显式排序的情况下进行(主要是出于性能方面的考虑),但是请注意,即使我们这样做,也无法保证arg的顺序,特别是如果您对arg顺序执行任何类型的操作表达。函数在SymPy中重建表达式的情况非常普遍,通常会使用与原始文件不相关的其他顺序。
x = Symbol('x', commutative=False)
x*y*z == y*x*z