【发布时间】:2020-11-23 22:19:48
【问题描述】:
我刚刚发现我对 block 如何用于函数有一些基本的误解。
一般来说,我认为“函数中发生的事情,保留在函数中(除非返回);”但是,情况似乎并非如此,所以我希望有人可以帮助我处理这种情况。
一个简单的例子:
/* Define & Initialize Variables */
[a,b]:[7,-5];
aFunction():= block([c:a, d:b], a:1, b:2,[c,d]);
现在,如果我们运行这个函数,我们会得到:
result1 : aFunction();
>>> [7, -5]
这很有意义:c 和 d 在 [ ] 内被分配了 a 和 b 的值,这给出了全局设置值,所以 a 和 b 的内部分配有对输出没有影响。
让我惊讶的是第二次运行该函数:
result2 : aFunction();
>>> [1,2]
我只能得出结论,a:1 和 b:2 块内发生的赋值 aFunction() 实际上会影响全局变量。如果这是真的,你如何组织你的工作,这样这种行为就不会回来咬你?我现在看到的唯一完全安全的方法是每次都开始一个新文档,这有点乏味。 是否有另一种方法可以确保函数内的工作不会影响函数外发生的事情?我在下面提供了我遇到的问题类型的示例,以获取更多上下文.
我如何理解我的一个例子是,我定义了一个变量defaultValue,该变量之前没有在文档的其他地方声明,位于块的[ ] 部分:
newFunction():=block( [ defaultValue : 10, a : defaultValue ] random(a) );
由于[ ] 部分中变量的并行分配,函数未按预期运行(因为defaultValue 未在全局范围内定义,它试图评估random(defaultValue))。
那时我不知道并行赋值,所以我尝试将赋值移动到块的主体。
newFunction():=block( [ a : defaultValue ], defaultValue : 10, random(a) );
当然,第一次运行也没有成功,所以我认为问题不在于作业的位置。然后我发现了其他一些我认为一定是错误的东西,因此,在解决了这个问题之后,我尝试将分配放回 [ ] 部分:
newFunction():=block( [ defaultValue : 10, a : defaultValue ] random(a) );
当然,因为我已经执行了函数,与此同时,defaultValue 已经被全局定义(我也不知道)。
我才意识到有些不对劲,因为不信任 Maxima 的黑魔法,总的来说,我想确保它按预期工作,所以尝试更改 defaultValue 的值,结果发现它没有效果(谢谢并行分配...)。
如前所述,我相信代码执行的原因是,当我将 defaultValue 的赋值移动到正文时,它将该值保存到了全局上下文中。 除了了解这个特殊案例之外,我还不清楚哪些最佳做法可以防止此类问题。有没有办法将函数的范围限制为仅本地定义的变量?
【问题讨论】:
标签: function global-variables local-variables maxima wxmaxima