为什么在下面的示例中,不是b的值被打印而是符号名称?如何强制打印变量的实际动态值?
a = {1, 2, 3};
DynamicModule[{b},
Print[Dynamic[b]];
{Dynamic[a], Dynamic[b]}
,
Initialization :> (b = Length[a]; a = a + 2)
]
输出:
b$107
Out[2]= {{3, 4, 5}, 3}
编辑(阅读您的答案/评论后):
考虑更简单的示例,没有 Initialization
代码(绕过 WReach 的示例):
a = {1, 2, 3};
DynamicModule[{b = Length[a]},
Print[Dynamic[b]];
{Dynamic[a], Dynamic[b]}
]
输出:
During evaluation of In[4]:= b$602
Out[5]= {{1, 2, 3}, 3}
请注意,如果我使用 Module
,这个示例就会实现我想要的效果而不是DynamicModule
或省略Dynamic
来自Print
线。我的担忧是:
为什么第二个示例无法正确打印 b 的值?没有初始化,其中(根据帮助)包含“首次显示 DynamicModule 时要计算的表达式”。另根据帮助:“首次评估
DynamicModule
时,首先对局部变量进行初始赋值,然后评估Initialization
选项的任何设置。”帮助应为:“初始化:首次显示
DynamicModule
的结果时计算的表达式”,这意味着Print
屏幕上的声明并不构成DynamicModule
的“结果” 。如果这是正确的,那么(只有那时)我才明白为什么Print
声明并不意味着Dynamic
对象正确显示。
最佳答案
我相信发生这种情况是因为调用Print
语句时尚未显示Dynamic
对象b
,因此初始化尚未制作。我记得,动态
功能只有在实际、可见地显示后才会运行。
参见Why won't this work? Dynamic in a Select了解更多信息。
<小时/>根据您的更新,我的理论是,Print
中的Dynamic
语句从未由前端显示,因此它从未实际初始化。也就是说,它仍然是一个唯一的占位符,等待最终显示时由 b
的动态值填充。
从下面的示例中可以看出,分配 RHS 评估发生在正文 Print
之前,至少通过前端中的显示顺序来衡量。此外,我们看到 Print
“进入”Dynamic
并获取由 DynamicModule
创建的唯一符号名称,并将其打印出来。我们可以使用 ToString
使 Print
按原样显示整个表达式。同样,如果我们从该字符串中提取符号名称,并将其转换为实际符号,则在打印之前,我们会得到确实已经分配的预期值。
alarm := (Print["Initialized!"]; 3)
DynamicModule[{b = alarm},
Print @ ToString @ Dynamic @ b;
Print @ Symbol @ StringTake[ToString@Dynamic@b, {9, -2}];
Print @ Dynamic @ b;
];
输出:
Initialized! Dynamic[b$701] 3 b$701
关于dynamic - 在 DynamicModule 中打印动态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7730863/