Assignment Operation is called as Hard Copy.
In [1]: par_list=[1,2,3,4,5] In [2]: child_list=par_list # Simple Assignment is called HardCopy In [3]: par_list Out[3]: [1, 2, 3, 4, 5] In [4]: child_list Out[4]: [1, 2, 3, 4, 5] In [5]: # 'is' operator returns True if both are addressing to the same object In [6]: # '==' operator checks the equivalence of the Values only In [7]: par_list == child_list Out[7]: True In [8]: par_list is child_list Out[8]: True In [9]: par_list Out[9]: [1, 2, 3, 4, 5] In [10]: par_list[2] = 'Udhay' In [11]: par_list Out[11]: [1, 2, 'Udhay', 4, 5] In [12]: child_list Out[12]: [1, 2, 'Udhay', 4, 5] In [13]: child_list[0] = "Prakash" In [14]: child_list Out[14]: ['Prakash', 2, 'Udhay', 4, 5] In [15]: par_list Out[15]: ['Prakash', 2, 'Udhay', 4, 5] In [16]: # As they are pointing to the same object, changing any of them, is reflect In [17]: # Now, let us compare this Hard COPY with Shallow COPY and Deep COPY In [18]: import copy In [19]: #shallow copy ----copy.copy() In [20]: #Deepcopy=========copy.deepcopy() In [21]: # Let us reassign the values In [22]: par_list=[1,2,3,4,5] In [23]: child_list1 = par_list In [24]: child_list2=copy.copy(par_list) In [25]: child_list3=copy.deepcopy(par_list) In [26]: par_list==child_list1==child_list2==child_list3 Out[26]: True In [27]: par_list is child_list1 is child_list2 is child_list3 Out[27]: False In [28]: par_list is child_list1 Out[28]: True In [29]: (par_list is child_list1, par_list is child_list2, par_list is child_list3) Out[29]: (True, False, False) In [30]: help(id) Help on built-in function id in module __builtin__: id(...) id(object) -> integer Return the identity of an object. This is guaranteed to be unique among simultaneously existing objects. (Hint: it's the object's memory address.) In [31]: (id(par_list), id(child_list1), id(child_list2), id(child_list3)) Out[31]: (51084984, 51084984, 51099888, 51084824) In [32]: par_list Out[32]: [1, 2, 3, 4, 5] In [33]: par_list[3] = "new" In [34]: par_list Out[34]: [1, 2, 3, 'new', 5] In [35]: par_list, child_list1, child_list2, child_list3 Out[35]: ([1, 2, 3, 'new', 5], [1, 2, 3, 'new', 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5] In [36]: # Only HardCOPYed list is effected In [37]: # It is an advantage in some cases. In [38]: # To investigate the difference between shallow copy and deepcopy, get us g In [39]: par_list=[1,2,3,[4,5,[6,7]]] In [40]: par_list Out[40]: [1, 2, 3, [4, 5, [6, 7]]] In [41]: child_list2=copy.copy(par_list) #shallow COPY In [42]: child_list3=copy.deepcopy(par_list) #Deep COPY In [43]: par_list Out[43]: [1, 2, 3, [4, 5, [6, 7]]] In [44]: child_list2 Out[44]: [1, 2, 3, [4, 5, [6, 7]]] In [45]: child_list3 #Deep COPY Out[45]: [1, 2, 3, [4, 5, [6, 7]]] In [46]: par_list is child_list2 #shallow COPY Out[46]: False In [47]: par_list is child_list3 #Deep COPY Out[47]: False In [48]: par_list == child_list2 #shallow COPY Out[48]: True In [49]: par_list == child_list3 #Deep COPY Out[49]: True In [50]: par_list[3][2][1] Out[50]: 7 In [51]: par_list[3][2][1] = "seven" In [52]: par_list Out[52]: [1, 2, 3, [4, 5, [6, 'seven']]] In [53]: child_list2 #shallow COPY Out[53]: [1, 2, 3, [4, 5, [6, 'seven']]] In [54]: child_list3 #Deep COPY Out[54]: [1, 2, 3, [4, 5, [6, 7]]] Verifying with single dimension lists In [59]: par_list = [1,2,3,4] In [60]: pa %page par_list pass %paste %pastebin In [60]: child_list1 = par_list In [61]: child_list2 = copy.copy(par_list) In [62]: child_list3 = copy.deepcopy(par_list) In [63]: par_list[2]= "two" In [64]: par_list Out[64]: [1, 2, 'two', 4] In [65]: child_list1 Out[65]: [1, 2, 'two', 4] In [66]: child_list2 Out[66]: [1, 2, 3, 4] In [67]: child_list3 Out[67]: [1, 2, 3, 4] CONCLUSION: In single dimension lists, if you do not want the copied list not to get affected to the changes in source list, go for shallow COPY. In multi-dimension lists, if you do not want the copied list not to get affected to the changes in source list, go for Deep COPY.
Comments
Post a Comment