Is there a way to separate open Mathematica notebooks so that they don’t share any variables? How about making it so some variables are shared but not all?
Share
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
Yes, there is. I recommend reading documentation related to Mathematica contexts. In a nutshell, all variables belong to some context (namespace), and all variables can be accessed via their fully-qualified names of the form “ContextName`varName”. If you just use “varName”, Mathematica will search contexts in
$ContextPath(try evaluating the variable$ContextPathto see what it is), and will use the first context where it finds that variable. In addition, each notebook specifies a context (stored in the variable$Context) where all its variables are stored (unless fully-qualified name is used).By default, for all notebooks the context is “Global`”. Also by default, $ContextPath for all notebooks includes the “Global`” context (as well as “System`” and some others). The net result is that variables are shared across notebooks, and this can rather quickly become annoying. However, there’s an easy solution. To create a “private” context for a notebook, evaluate the following:
This notebook will be assigned a unique context (evaluate the variable
$Contextto see what it is). Also, global context will be removed from ContextPath (try evaluating$ContextPathbefore and after theSetOptions[...]above to see what’s going on.)[Update: As pointed out by rcollyer on the new Mathematica stack exchange, to set this option as the default for new notebooks, do the following: open the Options Inspector (Ctrl+Shift+O), change the scope (in the dropdown on the top) from “Selection” to “Global Preferences”; on the left expand the nodes Cell Options -> Evaluation Options, and change the CellContext setting to “Notebook.”]
Now, here’s how to create a shared context:
Alternatively, you could’ve just typed
Now you can either use the fully qualified names (“SharedContext`varShared1” will work in any notebook), or you can add the context to $ContextPath:
If you do this in all notebooks, varShared1 will become visible without a fully-qualified name.
To summarize, context work a lot like many other search paths. However, there are many subtleties (for example, if a symbol has already been defined in some other context, the Begin[“SharedContext`”]/End[] block might not work as you expect — the existing context of the symbol will be used instead of SharedContext`), so I recommend a healthy dose of experimentation and perusing the docs.