假设我有以下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决定的(它必须被称为派生),所以不能在输出中包含这些矩阵(我不知道它是如何工作的,因为我必须混合输出数组中的标量和矩阵。)
如果我能以某种方式将它们作为参数传递,但在函数内部对它们进行全局永久更改,那就太好了。
答案 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)