我已经编写了一个函数derivative(w1, w2, pt)
,该函数在点f(x) = w1 * x**3 + w2 * x - 1
上评估了函数pt
的导数。奇怪的是,我发现根据def f(x)
位于derivative(w1, w2, pt)
内部还是外部而得到不同的结果。为什么def f(x)
的位置很重要/哪个正确?
示例1:
def derivative(w1, w2, pt):
x = sy.Symbol('x')
def f(x):
return w1 * x**3 + w2 * x - 1
# Get derivative of f(x)
def df(x):
return sy.diff(f(x),x)
# Evaluate at point x
return df(x).subs(x,pt)
derivative(5, 8, 2)
从中返回68
。
示例2:
def f(x):
return w1 * x**3 + w2 * x - 1
def derivative(w1, w2, pt):
x = sy.Symbol('x')
# Get derivative of f(x)
def df(x):
return sy.diff(f(x),x)
# Evaluate at point x
return df(x).subs(x,pt)
derivative(5, 8, 2)
从中返回53
。
答案 0 :(得分:2)
我认为这是您的全球范围受到污染。看这个例子:
import sympy as sy
def f(x, w1, w2):
return w1 * x**3 + w2 * x - 1
def derivative(w1, w2, pt):
x = sy.Symbol('x')
# Get derivative of f(x)
def df(x, w1, w2):
return sy.diff(f(x, w1, w2),x)
# Evaluate at point x
return df(x, w1, w2).subs(x,pt)
print(derivative(5, 8, 2))
这只是示例2的修改版本,它返回相同的答案。
答案 1 :(得分:1)
嵌套函数可以访问父函数中的本地名称。定义formGroup.value
外部时,它无法访问本地f
和w1
,因此必须假定它们是 globals < / em>。
如果您未在全局级别定义w2
和w1
,则第二个版本实际上会引发w2
:
NameError
您没有得到异常意味着您已经已经定义了>>> import sympy as sy
>>> def f(x):
... return w1 * x**3 + w2 * x - 1
...
>>> def derivative(w1, w2, pt):
... x = sy.Symbol('x')
... def df(x):
... return sy.diff(f(x),x)
... return df(x).subs(x,pt)
...
>>> derivative(5, 8, 2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in derivative
File "<stdin>", line 4, in df
File "<stdin>", line 2, in f
NameError: name 'w1' is not defined
和w1
,而正是这些这些值用来提供您不正确的答案。
您可以通过将w2
和w1
设置为全局变量来“修复”您的第二个示例。实际上,您作为w2
调用的第一个和第二个参数传入的内容并不重要,因为这些derivative()
和w1
参数值被完全忽略 :
w2
在您的本地设置中,您可能分别将>>> w1 = 5
>>> w2 = 8
>>> derivative('This value is ignored', 'And so is this one', 2)
68
和w1
分别设置为w2
和4
,因为正是这些值5
是x
:
53
在第一个示例中,>>> w1 = 4
>>> w2 = 5
>>> derivative('This value is ignored', 'And so is this one', 2)
53
中的本地人提供了w1
和w2
;不管您定义了什么全局名称,都不会使用它们。
如果您想在derivative()
之外定义f
,并且仍然将derivative()
和w1
传递给w2
,那么您还需要传递这些derivative()
函数上的相同值:
f()
现在def f(x, w1, w2):
return w1 * x**3 + w2 * x - 1
def derivative(w1, w2, pt):
x = sy.Symbol('x')
# Get derivative of f(x, w1, w2)
def df(x):
return sy.diff(f(x, w1, w2), x)
# Evaluate at point x
return df(x).subs(x,pt)
从嵌套的f()
函数(而不是全局变量)显式接收w1
和w2
。