Dynamic 动态列表操作

Dynamic 动态列表操作,dynamic,wolfram-mathematica,Dynamic,Wolfram Mathematica,我一直坚持我认为应该是一个相对简单的概念。我不理解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

我一直坚持我认为应该是一个相对简单的概念。我不理解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;但是,我希望每个语句都部分第一个元素。动态列表上的操作不需要执行

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


提前感谢您。

Dynamic的工作方式非同寻常。见:

赋值
b=Dynamic[First[a]]
不会计算为除文本表达式
Dynamic[First[a]]
之外的任何值,直到该表达式在屏幕上可见显示

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

动态
在某种程度上更像是一种显示技巧,而不是一种内部功能,这一事实不容忽视。错误理解
动态
的功能将导致许多混乱和挫折。然而,在您的简单示例中,您可以通过以下方式获得您想要的行为,至少在视觉上:

b = Dynamic[First[a]]

c = Dynamic[First@First[b]]

您已经得到了一个答案,为什么
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
的当前值,而不是定义时的值。而
动态
确保每当
a
更改时,显示的值都会重新计算。

@Heike我以为我只是在捡废品。我不知道你还在这里回答问题。:-)我偶尔在mma.SE上安静的时候登记