gpt4 book ai didi

wolfram-mathematica - 使用相同的本地符号在另一个模块中创建模块是否安全?

转载 作者:行者123 更新时间:2023-12-04 22:50:07 25 4
gpt4 key购买 nike

我发现有时能够使用自己的本地符号制作本地模块(在父模块内)很有用,它完成了一项仅由父模块使用的小任务。当模块变大时,这很有用,并且没有充分的理由在模块外部制作较小的辅助函数,因为这些辅助函数只有一个父模块真正需要和使用。

这是一个愚蠢的例子,它有一个模块,里面有一个辅助模块

foo[x_] := Module[{r},

r = Module[{y, sol},
sol = First@Solve[y^2 + 3 y + 2 == 0];
y /. sol
];

x^r

]

但是上面的问题是,内部模块的局部变量,可能与父模块的局部变量冲突,因为当我执行以下操作时,M notebook 使内部模块局部变量变为红色,这告诉我我正在做某事我不应该这样做:(我不想一直担心检查我是否为内部模块使用了唯一的本地符号,它不同于用作父模块的本地符号的本地符号,毕竟,它是应该是本地的。在这种情况下还必须提出不同的符号名称)
foo[x_] := Module[{r, y=0},

r = Module[{y, sol},
sol = First@Solve[y^2 + 3 y + 2 == 0];
y /. sol
];

x^r

]

注意红色,根据帮助,它是局部范围冲突或多个上下文中的阴影。

enter image description here

(M 需要使用更好的颜色,很难区分多种颜色,所有深浅不一的红色)。

enter image description here

(我认为这是一个阴影警告)无论哪种方式,它都告诉我我不应该这样做,即使我在使用这种构造时没有看到任何问题。

此示例中父模块局部变量 'y' 的值没有被内部模块 'r' 的调用覆盖,这很好。

同样,我不想在 foo 之外创建一个函数,因为这个小任务仅由 foo[] 使用,无需将其移动到全局上下文。

当然,我总是可以写:
foo[x_] := Module[{r, y, sol},

sol = First@Solve[y^2 + 3 y + 2 == 0];
r = y /. sol;

x^r

]

但我只是举一个例子,这是针对大型模块的,它有助于将模块本身内部的任务分解成几个更小的任务。内部函数,内部函数是我之前在其他语言中使用的东西,例如 Ada/Pascal 等,它具有这种结构并且对大型程序很有用。

我的问题是:只是想在这里与专家核实一下我是否可以安全地使用上述内容,即使 M 给了我这个红色警告?如果有什么我需要担心的

谢谢,

最佳答案

是的,在嵌套 Modules 中使用相同的变量是安全的只要你不忘记他们。 Mathematica 处理 Module 中定义的每个变量作为该模块的本地。局部变量是 Temporary , 编号为 variable$ModuleNumber .您可以通过以下示例自行检查:

Module[{x = 1},
Print[HoldForm@x, " = ", x]
Module[{x = 2},
Print[HoldForm@x, " = ", x]
Module[{x = 3},
Print[HoldForm@x, " = ", x]
];
Print[HoldForm@x, " = ", x]
];
Print[HoldForm@x, " = ", x]
]

(*Output
x$4576 = 1
x$4577 = 2
x$4578 = 3
x$4577 = 2
x$4576 = 1
*)

关于wolfram-mathematica - 使用相同的本地符号在另一个模块中创建模块是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8600404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com