Dynamic 动态列表操作
我一直坚持我认为应该是一个相对简单的概念。我不理解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
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上安静的时候登记