6

我坚持我认为应该是一个相对简单的概念。我不了解 Dynamic[] 与增量列表操作有关的功能。考虑以下陈述:

In[459]:= x={{1,2}};
In[462]:= y=First[x]
Out[462]= {1,2}
In[463]:= z=First[y]
Out[463]= 1

简单吧?现在,我希望 z 在我更改 x 时动态更新。这是我的尝试:

In[458]:= a={{1,2}};
In[452]:= b=Dynamic[First[a]]
Out[452]= {1,2}
In[449]:= c=Dynamic[First[b]]
Out[449]= {1,2}

当我更改列表 a 中的值时,我看到相应的更改是 b 和 c;但是,我希望每个语句都包含一个元素。没有对动态列表进行操作。

我的问题是为什么我们会看到这种行为,以及如何应用连续的动态列表操作?

先感谢您。

4

2 回答 2

5

动态以一种不同寻常的方式工作。请参阅:为什么这不起作用?选择中的动态

除非该表达式在屏幕上可见地显示,否则赋值b = Dynamic[First[a]]不会计算为文字表达式以外的任何内容。Dynamic[First[a]]

因此,当您写作时,First[b]您要求的第一部分Dynamic[First[a]]First[a].

在某种程度上,它更像是一种显示技巧而不是内部功能,这一事实Dynamic不容忽视。错误的功能Dynamic会导致很多混乱和挫败感。尽管如此,在您的简单示例中,您至少可以通过以下方式获得您想要的行为:

b = Dynamic[First[a]]

c = Dynamic[First@First[b]]
于 2012-04-15T08:31:05.690 回答
2

您已经得到了答案,为什么Dynamic不能按预期工作,但是我将添加如何实现(我认为)您想要的:

a={{1,2}}
(*
==> {{1,2}}
*)

b:=First[a];Dynamic[b]
(*
==> {1,2}
*)

c:=First[b];Dynamic[c]
(*
==> 1
*)

a={{3,4}}
(*
==> {{3,4}}
-- The displays for b and c now change to {3,4} and 3
*)

通过使用SetDelayed( :=),您可以确保每次评估b和时,c都使用 的当前值a,而不是它在定义时的值。并Dynamic确保在a更改时重新评估显示的值。

于 2012-04-15T11:06:34.750 回答