[AMG]: Tcl values, a.k.a. [Tcl_Obj]s, are conceptually immutable. "Changing" a value produces a new value ([copy-on-write]), and any references to the old value continue to point to the old value. In practice, ''unshared'' values can be modified in-place without being copied. This is allowed because it's fast and it does not violate the useful properties of ''the immutability of values''. If you're a data structure or a piece of code and you have a reference to a value, you can count on that value never changing. If you want to change it, you have to operate on an unshared copy. Behind the scenes, that unshared copy might not be a copy at all; the important thing is that it's unshared. I'm pretty sure that changing the type of the internal (non-string) representation of a value can only legally be done on an unshared copy. Can someone please confirm? '''[DGP]''' That's false. So long as the string rep is not changed, the internal rep can move from one Tcl_ObjType to another within a shared Tcl_Obj. Holders of a pointer to a Tcl_Obj should not assume otherwise. [AK]: DGP is quite right. See also [shimmering]. <> Concept | Internals