没有将症状符号传递给函数的缺点吗?
def compute(alpha,a): #or def compute(a)
return 3*alpha+a
alpha = sympy.symbols("alpha")
expr = compute(alpha,3)
我没有必要将alpha
传递给compute()
(我假设因为它是一个全局变量),而且现在,我认为它可以让代码在我离开时更具可读性。
这被认为是糟糕的设计吗?我想这是一个普遍的“如何处理python中的全局变量”问题,正如已经被问到here,但答案说它将取决于具体的用例。
在调用该函数之前,我仍然需要创建alpha
符号,如果我不包含它,那就不明显了。
答案 0 :(得分:2)
与列表(另一个问题是关于)相比,SymPy treats symbols (and expressions) as immutable。此外,它们由您传递给Symbol
或symbols
的字符串唯一标识。为便于说明,请考虑以下事项:
from sympy import Symbol
print({Symbol("a"), Symbol("a")})
>>> {a}
因此,将SymPy符号声明为全局变量不会构成如此大的问题 - 就像全局定义一些数学常量一样。例如,使用此符号的某些合理代码不会改变它.¹
因此,根据具体情况,它可能有意义:
alpha
,alpha
作为参数传递给函数alpha
(这是可能的,因为符号仅取决于相关的字符串)。如果没有进一步的背景,就不可能说出哪种情况适用于你的情况。
¹请注意,不合理的代码仍然可以这样做,例如:
from sympy.abc import a
from sympy.abc import a as a_2
a.name = "b"
print(a_2)
>>> b
答案 1 :(得分:1)
在文件顶部定义常用的符号(即全局)是非常好的做法。正如其他人所指出的那样,即使它再次被定义,它也不会真正重要,因为具有相同名称的两个符号被认为是相等的。 这里有一个重要的警告:如果你使用假设,比如real=True
,那么这很重要。因此,您应该避免使用两个具有相同名称但不同假设的符号。
在您的示例中,如果alpha
始终应该是符号Symbol('alpha')
,那么为永远不会更改的函数设置参数是没有意义的。
顺便说一下,你可以做的另一种方法是根本没有这个功能,只是使用带有符号变量的表达式
alpha, a = symbols('alpha a')
expr = 3*alpha + a
然后在想要替换值时使用subs
expr.subs({a: 3}) # or expr.subs(a, 3)