Ключевое поведение описано в разделе Дополнительная информация документации для DynamicModule :
DynamicModule сначала дает уникальныйимена для локальных переменных в expr , точно так же как Module , затем оценивает полученное выражение и затем возвращает версию этого обернутого в DynamicModule .
Точная последовательность событий становится более очевидной, если добавить к параметру Initialization
оператор Print
, таким образом:
a = {1, 2, 3};
DynamicModule[{b},
Print[Dynamic[b]];
{Dynamic[a], Dynamic[b]}
,
Initialization :> (b = Length[a]; Print["init:", b]; a = a + 2)
]
, в результате чего получится три ячейки:
b$107
Out[7]= {{3, 4, 5}, 3}
init:3
Ячейка, содержащая b$107
, является результатом Print
внутри DynamicModule
.Затем мы получаем ячейку результата (помеченную Out[7]
здесь).Наконец, мы видим третий вывод ячейки с помощью оператора Print
в Initialization
.
Если вы проверите выражение ячейки Out[7]
, вы обнаружите, что локализованная переменная равна b$$
.Это отличается от переменной в первой ячейке, которая равна b$107
.Это различие связано с «двойной областью видимости», описанной в документации DynamicModule
.Ячейка b$107
содержит поле Dynamic
, что можно увидеть, если мы присвоим значение b$107
.
Обновление
В ответ на обновленноевопрос ...
Возвращаясь к исходному выражению (без дополнительных Print
в Initialization
), точная последовательность событий выглядит следующим образом:
Во-первых, телоDynamicModule
оценивается после предоставления "уникальных имен локальным переменным [...] точно так же, как Module ".То есть это выражение вычисляется:
Print[Dynamic[b$107]]; {Dynamic[a], Dynamic[b$107]}
Результатом этого выражения является список {Dynamic[a], Dynamic[b$107]}
.В качестве побочного эффекта создается динамическая ячейка, содержащая b$107
, но эта ячейка теперь удалена из дальнейшего рассмотрения, поскольку она не является частью результата оценки.Теперь «версия [{Dynamic[a], Dynamic[b$107]}
] обернута в DynamicModule » и возвращена.Это оценивается и неявно печатается для получения выражения выходной ячейки, подобного этому:
Cell[BoxData[
DynamicModuleBox[{$CellContext`b$$ = 3},
RowBox[{"{",
RowBox[{
DynamicBox[ToBoxes[$CellContext`a, StandardForm],
ImageSizeCache->{57., {2., 8.}}], ",",
DynamicBox[ToBoxes[$CellContext`b$$, StandardForm],
ImageSizeCache->{7., {0., 8.}}]}], "}"}],
DynamicModuleValues:>{},
Initialization:>($CellContext`b$$ =
Length[$CellContext`a]; $CellContext`a = $CellContext`a + 2)]], "Output"]
Обратите особое внимание, что b$107
переименовано в $CellContext`b$$
как функция DynamicModule
локализации символа.Выражение Initialization
теперь оценивается, когда поле отображается и отображается.
Ключевым моментом является то, что напечатанная ячейка, содержащая b$107
, никак не связана с последней ячейкой DynamicModule
.