Ответ 1
Да, есть. Я рекомендую читать документацию, связанную с контекстами Mathematica. В двух словах все переменные принадлежат некоторому контексту (пространству имен), и все переменные могут быть доступны через их полностью квалифицированные имена формы "ContextName`varName". Если вы просто используете "varName", Mathematica будет искать контексты в $ContextPath
(попробуйте оценить переменную $ContextPath
, чтобы увидеть, что это такое), и будет использовать первый контекст, где он найдет эту переменную. Кроме того, каждый блокнот указывает контекст (хранится в переменной $Context
), где хранятся все его переменные (если не используется полностью квалифицированное имя).
По умолчанию для всех ноутбуков контекст "Глобальный". Также по умолчанию $ContextPath для всех ноутбуков включает контекст "Глобальный" (а также "Система" и некоторые другие). Конечным результатом является то, что переменные распределяются между ноутбуками, и это довольно быстро становится раздражающим. Однако есть простое решение. Чтобы создать контекст "private" для ноутбука, оцените следующее:
SetOptions[EvaluationNotebook[], CellContext -> Notebook]
Для этого ноутбука будет назначен уникальный контекст (оцените переменную $Context
, чтобы узнать, что это такое). Кроме того, глобальный контекст будет удален из ContextPath (попробуйте оценить $ContextPath
до и после SetOptions[...]
выше, чтобы узнать, что происходит.)
[ Обновление. Как указано rcollyer в новом обмене стека Mathematica, чтобы установить этот параметр как стандартное для новых ноутбуков, выполните следующие действия: откройте опцию Inspector (Ctrl + Shift + O), измените область действия (в раскрывающемся списке вверху) с "Выбор" на "Глобальные настройки"; слева разверните узлы Параметры ячейки → Параметры оценки и измените параметр CellContext на "Ноутбук".]
Теперь, как создать общий контекст:
Begin["SharedContext`"];
varShared1 = "Shared string";
End[];
В качестве альтернативы вы можете просто ввести
SharedContext`varShared1 = "Shared string";
Теперь вы можете использовать полные имена ( "SharedContext`varShared1" будет работать в любом ноутбуке), или вы можете добавить контекст в $ContextPath:
AppendTo[$ContextPath, "SharedContext`"]
Если вы сделаете это во всех ноутбуках, varShared1 станет видимым без полного имени.
Подводя итог, контекст работает так же, как и многие другие пути поиска. Однако есть много тонкостей (например, если символ уже определен в каком-то другом контексте, блок Begin ["SharedContext`]/End [] может работать не так, как вы ожидаете - существующий контекст символа будет вместо SharedContext`), поэтому я рекомендую здоровую дозу экспериментов и ознакомление с документами.