gpt4 book ai didi

dynamic - 在 DynamicModule 中打印动态变量

转载 作者:行者123 更新时间:2023-12-02 10:49:19 24 4
gpt4 key购买 nike

为什么在下面的示例中,不是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线。我的担忧是:

  1. 为什么第二个示例无法正确打印 b 的值?没有初始化,其中(根据帮助)包含“首次显示 DynamicModule 时要计算的表达式”。另根据帮助:“首次评估 DynamicModule 时,首先对局部变量进行初始赋值,然后评估 Initialization 选项的任何设置。”

  2. 帮助应为:“初始化:首次显示 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]3b$701 

关于dynamic - 在 DynamicModule 中打印动态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7730863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com