为什么这样的:setdelayed内部操作产生一个评估循环。为什么?
Manipulate[test[a_] := 2*b; test[c], {b, 0, 1}, {c, 0, 1}]
变成一个评价循环? 不应该Manipulate
只有当b
或c
变化时才会评估?
为什么这样的:setdelayed内部操作产生一个评估循环。为什么?
Manipulate[test[a_] := 2*b; test[c], {b, 0, 1}, {c, 0, 1}]
变成一个评价循环? 不应该Manipulate
只有当b
或c
变化时才会评估?
是的,Manipulate
将重新评估当b
或c
变化,也如果test
变化 - 和test
被重新分配,每次的这些值变化的任何一个。因此,无尽的重新评估循环。
为避免评估循环,竞态条件和其他令人惊讶的行为,通常应避免在结构的显示表达式中使用类似Manipulate
和Dynamic
的副作用。在当前情况下,我建议在test
取消对b
隐含的依赖和吊装Manipulate
之外它的定义:
test[b_, c_] := 2*b; Manipulate[test[b, c], {b, 0, 1}, {c, 0, 1}]
在实际应用中,可能有这样一个简单的重构的障碍 - 但关键是要从动态表达中删除:=
。
要解决最小的变化的问题,请
Manipulate[
test[a_] := 2*b;
test[c], {b, 0, 1}, {c, 0, 1},
TrackedSymbols \[Rule] {b, c}]
代替(即,添加TrackedSymbols
告诉Mathematica的跟踪内容更改)。