我正在尝试编写一个具有默认值 sympy 符号的函数,但没有得到我所期望的结果。
这是我的代码
import sympy as sy
def addtwo(y = sy.symbols('y', reals = True)):
return y + 2
y = sy.symbols('y')
x = addtwo()
print(type(x))
print(x)
print(x.subs(y,1))
有输出
<class 'sympy.core.add.Add'>
y + 2
y + 2
但是,代码
y = sy.symbols('y')
x = addtwo(y)
print(x)
print(x.subs(y,1))
给出预期的输出
y + 2
3
考虑这两个符号:
y1 = sy.symbols('y')
和y2 = sy.symbols('y')
。尽管它们是在不同时间创建的,但它们是平等的:它们具有相同的名称和相同的假设(在本例中没有,它们只是复杂的符号)。现在考虑 y3 = sy.symbols('y', real=True)
,它具有相同的名称但不同的假设。所以 y3
与 y1, y2
不同。
回到第一个示例,替换不起作用,因为您在函数内部创建的符号与您在外部创建的符号不同。换句话说,您在外部创建的符号不包含在表达式中。
因为您正在处理仅包含一个符号的表达式,所以一种可能的解决方案是从符号表达式中包含的符号集中检索它,如下所示:
import sympy as sy
def addtwo(y = sy.symbols('y', reals = True)):
return y + 2
x = addtwo()
# .free_symbols returns a set of symbols contained in the symbolic expression
my_y = x.free_symbols.pop()
print(type(x))
print(x)
print(x.subs(my_y,1))