评估函数内部尚未传递方法参数的方法

问题描述 投票:1回答:2

考虑以下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?)

python parameter-passing sympy
2个回答
1
投票

对于另一个答案,我想补充一点,这与SymPy无关。这就是Python的工作原理。如果函数引用了未在该函数中定义的变量,则它从定义函数的外部命名空间获取它(您可以在此站点或Web上搜索“Python范围”以获取有关此内容的更多信息)。

这“工作”,因为你还使用变量名称argsymbols('t')。一般来说,我建议将SymPy变量命名为与其符号名称相同,因此不使用arg,而是使用

t = symbols('t')

如果你总是这样做,你会避免很多头痛。


3
投票

我认为这只是糟糕的代码,因为它依赖于全局变量arg,而它应该是differentiate的参数之一。例如,如果你调用这个变量argument,该函数将不起作用。

此代码有效,因为arg是一个全局变量,可供任何函数访问。因此,解释器“看到”函数中名称arg的用法并询问自己:“在本地范围内是否有一个名为arg的变量?” - 不; “在全球范围内是否有一个名为arg的变量?” - 是的所以,它需要它并作为func.diff的参数传递。

© www.soinside.com 2019 - 2024. All rights reserved.