when we assign large collectionssuch as long liststhe savings are very apparent here is an examplesongs ["because""boys""carol"beatles songs beatlessongs (['because''boys''carol']['because''boys''carol']herea new object reference (beatleshas been createdand both object references refer to the same list--no copying has taken place since lists are mutablewe can apply change for examplebeatles[ "cayennebeatlessongs (['because''boys''cayenne']['because''boys''cayenne']we applied the change using the beatles variable--but this is an object reference referring to the same list as songs refers to so any change made through either object reference is visible to the other this is most often the behavior we wantsince copying large collections is potentially expensive it also meansfor examplethat we can pass list or other mutable collection data type as an argument to functionmodify the collection in the functionand know that the modified collection will be accessible after the function call has completed howeverin some situationswe really do want separate copy of the collection (or other mutable objectfor sequenceswhen we take slice--for examplesongs[: ]--the slice is always an independent copy of the items copied so to copy an entire sequence we can do thissongs ["because""boys""carol"beatles songs[:beatles[ "cayennebeatlessongs (['because''boys''cayenne']['because''boys''carol']for dictionaries and setscopying can be achieved using dict copy(and set copy(in additionthe copy module provides the copy copy(function that returns copy of the object it is given another way to copy the built-in collection types is to use the type as function with the collection to be copied as its argument here are some examplescopy_of_dict_d dict(dcopy_of_list_l list(lcopy_of_set_s set(snotethoughthat all of these copying techniques are shallow--that isonly object references are copied and not the objects themselves for immutable