# Is there a way to separate variables between multiple notebooks?

I often correct homework by checking the calculations in Mathematica. Sometimes you would like to have two solutions open at once. However often defined symbols such as f or phi regularly overlap between the two notebooks.

• Is there a way to separate them other than using different symbols in every notebook?

• Is it possible to separate some variables yet share others between notebooks?

-
support.wolfram.com/kb/3664 –  Searke Mar 23 '12 at 18:22
@LeonidShifrin If I have two Mathematica workbooks that I would like to combine, is there a way to check whether they have any variables in common? Just like niklasfi, I often use symbols such as f in several documents. I was thinking of checking all the user-defined variables/functions in each of the documents, but I'm not sure how to do so. –  Vincent Tjeng Mar 26 '13 at 5:20
@VincentTjeng As far as I know, there is no automatic way. But it is possible to write a program that would do that. You can post this as a separate question, and I am sure you will get some good answers. –  Leonid Shifrin Mar 26 '13 at 10:36

May be this, I have not tried it, but it sounds like this is what you are looking for (if I understood you correctly):

Evaluation menu -> Notebook's Default Context -> Unique to This Notebook.


So, you do the above for each notebook.

I found this in the daily Mathematica tip webpage: http://twitter.com/mathematicatip

Update

If you want to do it programatically from within a notebook, run SetOptions[EvaluationNotebook[], CellContext -> Notebook].

Update 2

To set this automatically for all new notebooks, open the Options Inspector (Ctrl/Command+Shift+O), and change the scope to "Global Preferences." Then, the option CellContext is found under Cell Options -> Evaluation Options. Change it to "Notebook."

-
Is there a way to do this from within a notebook? e.g. calling a function like Quit? –  niklasfi Jan 28 '12 at 12:18
Is there a way to get Mathematica to set the context of new notebooks to be private by default, instead of having to create a private context for every new notebook manually? –  Joe Mar 6 '12 at 7:40
@Joe Just looking for that myself. I added the info to the answer. –  rcollyer Mar 23 '12 at 17:29
Yes! Thank you @rcollyer, I've been looking for a way to do this for ages! –  Joe Mar 24 '12 at 9:21

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 "ContextNamevarName". If you just use "varName", Mathematica will search contexts in $ContextPath (try evaluating the variable $ContextPath to 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:

SetOptions[EvaluationNotebook[], CellContext -> Notebook]


This notebook will be assigned a unique context (evaluate the variable $Context to see what it is). Also, global context will be removed from ContextPath (try evaluating $ContextPath before and after the SetOptions[...] 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:

Begin["SharedContext"];
varShared1 = "Shared string";
End[];


Alternatively, you could've just typed

SharedContextvarShared1 = "Shared string";


Now you can either use the fully qualified names ("SharedContextvarShared1" will work in any notebook), or you can add the context to $ContextPath: AppendTo[$ContextPath, "SharedContext"]


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.

-
You can also set this via the Evaluation > Notebook's Default Context menu (instead of SetOptions.) [The documentation uses the "Unique to Each Cell Group" setting so that there aren't any variable conflicts.] –  Brett Champion Feb 4 '11 at 14:56
Followup question: is there anyway to make Mathematica set the context of new notebooks to be private by default, instead of having to create a private context for every new notebook manually? –  Joe Aug 29 '11 at 7:16
@Joe: Not that I know of, but I have written some convenience functions to easily set and access private contexts. I just type setPrivate[] when I start a new notebook, and spawnScratch[] when I want to duplicate the existing notebook's context in another notebook. I've used this for over a year and found it to be acceptably convenient. The code is here: github.com/leoalekseyev/mma-context –  Leo Alekseyev Jan 11 '12 at 23:10