Assignment and argument passing semantics

Limited how? It’s a valid viewpoint that’s consistent with Julia’s semantics. The reality is somewhere in between “all 1s are the same” and “all 1s are equivalent copies”: some instances of the expression 1 will refer to a shared copy of the object 1 (via the Int box cache), others will refer to separate copies (in registers or arrays), still others will never refer to any object at all (optimized out). The whole point of having semantics as an abstraction is that it doesn’t matter, so if someone wants to think of things in terms of one potential implementation of the semantics, they’re free to do so.