I want to bring up something in response to the comments (from the OP and Colomon, mainly) about efficiency etc. Often times copying stuff around really doesn't matter, in terms of real performance.
I have written programs that do a lot of defensive copying. It's an idiom in Java, where, because all objects are passed by pointer, there's lots of aliasing going on, so you copy anything going into/out of your class to break the aliasing, ensuring that clients of your class cannot violate your class invariants by modifying an object after the fact.
The programs I've written have defensively copied whole structures in places, including entire lists and maps. Just to be sure that performance isn't affected, I profiled the program extensively. The main bottlenecks were elsewhere (and even then, I tuned those other places so that the main bottleneck left is the network). Nowhere did this defensive copying figure into the hot spots of the program.
ETA: I feel the need to clarify the point of my message, since one commenter read it differently from how I intended, and quite possibly others have done too. My point isn't that it's okay to copy stuff around willy-nilly; but rather, one should always profile the performance of their code, rather than guess wildly at how it will perform.
Sometimes, when copying whole structures still gives acceptable performance, and at the same time make the code easier to write, then in my opinion, that is a better tradeoff (in most cases) than code that's only marginally faster but much more complicated.