In my previous post I just "reproduced" from memory what I had gathered
from reading various posts here in the past.
Now, I tried to verify it, using tcl8.6's ::tcl::unsupported::representation:
% # create a pure list. ("llength $a" is to avoid the print out)
% set a [lrepeat 10000 foo] ; llength $a
10000
% ::tcl::unsupported::representation $a
value is a list with a refcount of 2, object pointer at 0x8158be8, internal representation 0x81a2c28:(nil), no string representation
% # it's a pure list: let's turn it into a dict:
% llength [dict values $a]
1
% ::tcl::unsupported::representation $a
value is a dict with a refcount of 2, object pointer at 0x8158be8, internal representation 0x819d198:(nil), string representation "foo foo foo f..."
% # yes it is a dict, but the previous list is now preserved as a string rep !
% # now turn it back into a list:
% llength $a
10000
% ::tcl::unsupported::representation $a
value is a list with a refcount of 2, object pointer at 0x8158be8, internal representation 0x81a2c28:(nil), string representation "foo foo foo f..."
% # string rep is kept, dict-rep is lost.
I don't know, if the dict is created directly from the list, or if
all goes through the string rep. Neither do I know, whether the dict
maintains a list of its values, but I'd rather doubt it, so I'd rather
believe that at least the extraction of values was actually re-done
1000 times during your measurement.