考虑以下Python3代码,我在其中定义函数f(t)^ 2并区分它:
import sympy as sp
def differentiate(func):
return func.diff(arg)
fct = sp.symbols('f', cls=sp.Function)
arg = sp.symbols('t')
expr = fct(arg) ** 2
print(differentiate(expr)) # returns 2*f(t)*Derivative(f(t), t)
我的问题是,为什么没有必要也将Python变量arg
的名称传递给differentiate
函数?
(我只传递了表达式expr
,我认为这是一个对象为我创造的对象。如何应用于这方面的差异知道arg
?)
对于另一个答案,我想补充一点,这与SymPy无关。这就是Python的工作原理。如果函数引用了未在该函数中定义的变量,则它从定义函数的外部命名空间获取它(您可以在此站点或Web上搜索“Python范围”以获取有关此内容的更多信息)。
这“工作”,因为你还使用变量名称arg
为symbols('t')
。一般来说,我建议将SymPy变量命名为与其符号名称相同,因此不使用arg
,而是使用
t = symbols('t')
如果你总是这样做,你会避免很多头痛。
我认为这只是糟糕的代码,因为它依赖于全局变量arg
,而它应该是differentiate
的参数之一。例如,如果你调用这个变量argument
,该函数将不起作用。
此代码有效,因为arg
是一个全局变量,可供任何函数访问。因此,解释器“看到”函数中名称arg
的用法并询问自己:“在本地范围内是否有一个名为arg
的变量?” - 不; “在全球范围内是否有一个名为arg
的变量?” - 是的所以,它需要它并作为func.diff
的参数传递。