爲什麼這樣的: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的跟蹤內容更改)。