全局更改python函数的参数

时间:2017-10-18 12:47:57

标签: python scipy global pass-by-reference odeint

假设我有以下python代码

y = 2

def f(x, y):
    y = y**2
    return x*y

for i in range(5):
    print(f(2,y))

是否有可能在f global中对y进行更改,同时仍然将其作为参数传递给f? 我知道

y = 2

def f(x, y):
    global y
    y = y**2
    return x*y

for i in range(5):
    print(f(2,y))

不起作用,因为y不能是全局函数和函数参数。 我所拥有的丑陋解决方案根本就不是把y作为一个论点来传递:

y = 2
def f(x):
    global y
    y = y**2
    return x*y

for i in range(5):
    print(f(2,y))

但我对此不满意,因为我想明确地将y传递给函数并基本上通过引用调用它。

这个问题的背景是我想使用scipy的odeint,并且我必须在计算导数时使用稀疏矩阵,该矩阵也随时间变化。

如果我想避免在每个时间步将它们转换为numpy并返回稀疏,我必须将它们全局存储并在函数内修改它们。因为函数的输出是由odeint决定的(它必须被称为派生),所以不能在输出中包含这些矩阵(我不知道它是如何工作的,因为我必须混合输出数组中的标量和矩阵。)

如果我能以某种方式将它们作为参数传递,但在函数内部对它们进行全局永久更改,那就太好了。

3 个答案:

答案 0 :(得分:1)

只需为f的正式参数使用不同的名称:

y = 2

def f(x, y2):
    global y
    y = y2**2
    return x*y

for i in range(5):
    print(f(2,y))

如果我理解你的意图,那么我相信这对你有用。

答案 1 :(得分:0)

由于您所描述的原因,您不能完全这样做:变量不能同时是全局变量和本地变量。

然而,一种解决方案是:

using(var stream = entry.Open())
{
   stream.SetLength(document.Length);
   using (StreamWriter writer = new StreamWriter(stream))
   {
      writer.Write(document); //entry contents "baz123"
   }
}

这可以做你想要的,现在你可以拨打usort( $arr, function ( $a, $b ) { return ($a['urgent'] || $b['urgent']) && ($a['marketplace'] || $b['marketplace']); } ); y_default = 2 def f(x, y=None): if y is None: y = y_default y = y**2 return x*y

答案 2 :(得分:0)

基本上问题是y是全局的和本地的,因为错误消息会提示。因此,通过在本地引入变量z来避免局部变量问题。你仍然可以将y传递给z,然后产生所需的结果。

y = 2

def f(x, z):
  y = z**2
  global y
  return x*y

for i in range(5):
  print f(2,y)