knp*_*wrs 26 wolfram-mathematica
有没有办法分开打开的Mathematica笔记本,以便它们不共享任何变量?如何让一些变量共享但不是全部?
Leo*_*yev 36
就在这里.我建议阅读与Mathematica上下文相关的文档.简而言之,所有变量都属于某个上下文(命名空间),并且所有变量都可以通过其形式为"ContextName`varName"的完全限定名称来访问.如果您只使用"varName",Mathematica将搜索上下文$ContextPath(尝试评估变量$ContextPath以查看它是什么),并将使用它找到该变量的第一个上下文.此外,每个笔记本指定存储$Context其所有变量的上下文(存储在变量中)(除非使用完全限定名称).
默认情况下,对于所有笔记本,上下文为"全局".此外,默认情况下,所有笔记本的$ ContextPath都包含"Global`"上下文(以及"System`"和其他一些内容).最终结果是变量在笔记本电脑之间共享,这很快就会变得很烦人.但是,有一个简单的解决方案.要为笔记本创建"私有"上下文,请评估以下内容:
SetOptions[EvaluationNotebook[], CellContext -> Notebook]
Run Code Online (Sandbox Code Playgroud)
将$Context为此笔记本分配一个唯一的上下文(评估变量以查看它是什么).此外,全局上下文将从ContextPath中删除(尝试$ContextPath在SetOptions[...]上面之前和之后进行评估,看看发生了什么.)
[ 更新:正如rcollyer在新的Mathematica堆栈交换中所指出的,要将此选项设置为新笔记本的默认选项,请执行以下操作:打开选项检查器(Ctrl + Shift + O),更改范围(在下拉列表中)从"选择"到"全球偏好"的顶部); 在左侧展开节点单元格选项 - >评估选项,并将CellContext设置更改为"Notebook."]
现在,这是如何创建共享上下文:
Begin["SharedContext`"];
varShared1 = "Shared string";
End[];
Run Code Online (Sandbox Code Playgroud)
或者,你可以只输入
SharedContext`varShared1 = "Shared string";
Run Code Online (Sandbox Code Playgroud)
现在您可以使用完全限定名称("SharedContext`varShared1"将在任何笔记本中工作),或者您可以将上下文添加到$ ContextPath:
AppendTo[$ContextPath, "SharedContext`"]
Run Code Online (Sandbox Code Playgroud)
如果在所有笔记本中执行此操作,varShared1将在没有完全限定名称的情况下可见.
总而言之,上下文工作与许多其他搜索路径很相似.但是,有许多细微之处(例如,如果在某些其他上下文中已经定义了符号,则Begin ["SharedContext`"]/End []块可能无法正常工作 - 符号的现有上下文将使用而不是SharedContext`),所以我建议进行健康的实验和仔细阅读文档.
| 归档时间: |
|
| 查看次数: |
5126 次 |
| 最近记录: |