Ok, I arrived late, but let me do one more analogy:
Forget boxes. Boxes do not exist. Period.
When you create an object it simply exists. Semantically does not matter where it lives. (For performance reason it may matter but this is another topic.)
If you just create an object inside an expression and do not give it a label, then Julia knows it does not need to be stored anywhere and may discard it immediately after this use.
If you give it a label (this is called binding), then Julia know you may want to use that pile of data in the future, and keep it around somewhere.
You may want to give the object more than one label, the same pile of data may be referred by many names.
You may also pluck the labels from one pile of data and assign to other pile of data, none of this changes anything about the piles themselves. What was called current
in the iteration before may be called old
now.
If one pile of data lose all their labels, then Julia thinks you do not want anything anymore with that pile of data as you have no way of finding it anymore anyway (that pile is lost from your label-archiving system) and Julia then considers it garbage. When time for garbage collection comes, Julia sweeps all these unlabeled piles away.
structs
are just a pile of labels. As they are a pile, they may be labeled themselves. As they have labels inside, they point to other piles (that may be labeled other ways than just the label inside the struct, they may, for an example, also have a label in your local scope, outside any struct
).