【问题标题】:How to make a function accept a local variable as a parameter如何使函数接受局部变量作为参数
【发布时间】:2022-01-11 05:37:08
【问题描述】:

我定义了以下函数

def f(x):
    return x*a

def g(x,a):
    return f(x)

g(1,2)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in g
  File "<stdin>", line 2, in f
NameError: name 'a' is not defined

现在,如果我尝试为 xa 的任何值评估 g(x,a),则表明未定义 a。我怀疑这是因为a 应该是一个全局变量。

我听说使用全局变量是不好的做法,所以我的问题是如何让g(x,a) 给出一个以a 作为参数的结果?

注意:我没有将 a 作为参数提供给 f(x) 的原因是因为它需要作为一个微分方程(使用 scipy)来求解,只需要相关变量作为参数。

【问题讨论】:

  • 如果f 使用a,那么a 肯定与定义f 相关。你要解的数学方程是什么?
  • 实际涉及的函数要复杂得多,但要点是g是卡方,a是参数之一。 f 是一个依赖于参数a 的函数。微分方程类似于以a 为参数的dx/dt=f(x)。 Scipy 仅在函数具有微分方程中存在的参数时才求解。因此f 不能接受a 作为参数。
  • a 是一个会变化的参数,每个a 都会求解微分方程
  • “我没有将 a 作为参数提供给 f(x) 的原因是因为它需要作为一个微分方程(使用 scipy)来求解,只有相关变量作为参数。” - 这就是为什么 SciPy 求解器有一个 args 参数来为您传递给求解器的函数指定其他参数。
  • 对于没有这个参数的,你可以使用functools.partial,或者闭包(但是如果你使用闭包要注意后期绑定)。

标签: python variables scope


【解决方案1】:

既然 a 是函数 g 中的一个变量,为什么不通过以下方式避免整个全局情况:

def f(x):
    # do something to alter x
    return x

def g(x, a):
    return f(x)*a

g(1,2) # returns f(x) *2

【讨论】:

    猜你喜欢
    • 2011-02-14
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 2020-06-28
    相关资源
    最近更新 更多