Python sy.sympify(str(expression))不等于expression

Python sy.sympify(str(expression))不等于expression,python,type-conversion,sympy,Python,Type Conversion,Sympy,据我所知,str将一个SymPy表达式转换为字符串,sympify将一个字符串转换为SymPy表达式。因此,我希望(对于合理的表达)以下内容成立 我尝试过这一点,对于简单的例子(例如,expr=x+y)确实如此。但是,当我尝试使用以下表达式时,它不起作用: import sympy as sy a = sy.symbols("a") A = sy.Matrix(3,3, a) c0,c1,c2 = sy.symbols("c0 c1 c2", positive = True) c1*c2**2*

据我所知,
str
将一个SymPy表达式转换为字符串,
sympify
将一个字符串转换为SymPy表达式。因此,我希望(对于合理的表达)以下内容成立

我尝试过这一点,对于简单的例子(例如,
expr=x+y
)确实如此。但是,当我尝试使用以下表达式时,它不起作用:

import sympy as sy
a = sy.symbols("a")
A = sy.Matrix(3,3, a)
c0,c1,c2 = sy.symbols("c0 c1 c2", positive = True)
c1*c2**2*a(0, 1)**2*a(1, 2)*a(2, 2) - c1*c2**2*a(0, 1)**2*a(2, 2)**2 - c1*c2**2*a(0, 1)*a(0, 2)*a(1, 1)*a(2, 2) + c1*c2**2*a(0, 1)*a(0, 2)*a(2, 1)*a(2, 2) - c1*c2**2*a(0, 1)*a(1, 1)*a(1, 2)*a(2, 2) + c1*c2**2*a(0, 1)*a(1, 1)*a(2, 2)**2 + c1*c2**2*a(0, 2)*a(1, 1)**2*a(2, 2) - c1*c2**2*a(0, 2)*a(1, 1)*a(2, 1)*a(2, 2) - c1*a(0, 0)**2*a(1, 1)*a(2, 1) + c1*a(0, 0)**2*a(2, 1)**2 + c1*a(0, 0)*a(0, 1)*a(1, 1)*a(2, 0) - c1*a(0, 0)*a(0, 1)*a(2, 0)*a(2, 1) + c1*a(0, 0)*a(1, 0)*a(1, 1)*a(2, 1) - c1*a(0, 0)*a(1, 0)*a(2, 1)**2 - c1*a(0, 0)*a(1, 1)**2*a(2, 0) + c1*a(0, 0)*a(1, 1)*a(2, 0)*a(2, 1) - c2**2*a(0, 0)*a(0, 1)*a(1, 2)*a(2, 2) + c2**2*a(0, 0)*a(0, 1)*a(2, 2)**2 + c2**2*a(0, 0)*a(0, 2)*a(1, 1)*a(2, 2) - c2**2*a(0, 0)*a(0, 2)*a(2, 1)*a(2, 2) + c2**2*a(0, 1)*a(1, 0)*a(1, 2)*a(2, 2) - c2**2*a(0, 1)*a(1, 0)*a(2, 2)**2 - c2**2*a(0, 2)*a(1, 0)*a(1, 1)*a(2, 2) + c2**2*a(0, 2)*a(1, 0)*a(2, 1)*a(2, 2) + c2*a(0, 0)**2*a(1, 2)*a(2, 1) - c2*a(0, 0)**2*a(2, 1)*a(2, 2) - c2*a(0, 0)*a(0, 1)*a(1, 2)*a(2, 0) + c2*a(0, 0)*a(0, 1)*a(2, 0)*a(2, 2) - c2*a(0, 0)*a(1, 0)*a(1, 2)*a(2, 1) + c2*a(0, 0)*a(1, 0)*a(2, 1)*a(2, 2) + c2*a(0, 0)*a(1, 1)*a(1, 2)*a(2, 0) - c2*a(0, 0)*a(1, 1)*a(2, 0)*a(2, 2)
有人能告诉我为什么这个表达式不起作用吗


PS:我知道我应该给出一个最小的工作示例,但我只是没有找到表达式的哪一部分导致了问题。

一个最小的示例应该是

x = sy.symbols("x", positive=True)
expr = 2*x
sy.sympify(str(expr)) == expr   # False
这很有道理:
expr
的字符串表示形式,即
“2*x”
,没有关于x为正的信息。相应地,
sy.sympify(str(expr))
创建了一个名为“x”并带有默认假设的新符号。这是一个与原始符号不同的符号

如果没有积极性假设,比较结果将为真

保持正性假设的一种方法是使用
局部变量
字典明确表示字符串中的字符“x”表示现有符号
x

x = sy.symbols("x", positive=True)
expr = 2*x
sy.sympify(str(expr), locals={"x": x}) == expr    # True

假设你的表达式=sy.sympify(“c1*c2**2*a(0,1)…)#如果你现在执行sy.sympify(str(expr))==expr,它将返回True,我是否正确?@NishantPatel是的,在该步骤之后它是正确的。然而,我第一次转换它不是。
x = sy.symbols("x", positive=True)
expr = 2*x
sy.sympify(str(expr), locals={"x": x}) == expr    # True