@abert Maybe another example can throw some light on this.
q:=proc() local z; z end proc;
q(); # returns an 'escaped' local
%-z; # z - z
You see that there are two different names: the global z and the escaped local also printed as z.
You could continue with this:
z-z1-z2; # z-z-z
The idea of creating local names for use in some context is actually exemplified in a very old and undocumented procedure called `tools/gensym` ("generate (local) symbol"):
There is correspondingly this one:
Thus if you continue with this:
z-z1-z2-z3; # z-z-z-z
z-z1-z2-z3-z4; # z-z-z-z-z0
Looking at the addresses of the global z1 and the loval it evalutes to:
They are different.