What is the difference between shallow copy, deepcopy and normal assignment operation?

后端 未结 11 2215
温柔的废话
温柔的废话 2020-11-21 07:11
import copy

a = \"deepak\"
b = 1, 2, 3, 4
c = [1, 2, 3, 4]
d = {1: 10, 2: 20, 3: 30}

a1 = copy.copy(a)
b1 = copy.copy(b)
c1 = copy.copy(c)
d1 = copy.copy(d)


prin         


        
11条回答
  •  感情败类
    2020-11-21 07:19

    For immutable objects, creating a copy don't make much sense since they are not going to change. For mutable objects assignment,copy and deepcopy behaves differently. Lets talk about each of them with examples.

    An assignment operation simply assigns the reference of source to destination e.g:

    >>> i = [1,2,3]
    >>> j=i
    >>> hex(id(i)), hex(id(j))
    >>> ('0x10296f908', '0x10296f908') #Both addresses are identical
    

    Now i and j technically refers to same list. Both i and j have same memory address. Any updation to either of them will be reflected to the other. e.g:

    >>> i.append(4)
    >>> j
    >>> [1,2,3,4] #Destination is updated
    
    >>> j.append(5)
    >>> i
    >>> [1,2,3,4,5] #Source is updated
    

    On the other hand copy and deepcopy creates a new copy of variable. So now changes to original variable will not be reflected to the copy variable and vice versa. However copy(shallow copy), don't creates a copy of nested objects, instead it just copies the reference of nested objects. Deepcopy copies all the nested objects recursively.

    Some examples to demonstrate behaviour of copy and deepcopy:

    Flat list example using copy:

    >>> import copy
    >>> i = [1,2,3]
    >>> j = copy.copy(i)
    >>> hex(id(i)), hex(id(j))
    >>> ('0x102b9b7c8', '0x102971cc8') #Both addresses are different
    
    >>> i.append(4)
    >>> j
    >>> [1,2,3] #Updation of original list didn't affected copied variable
    

    Nested list example using copy:

    >>> import copy
    >>> i = [1,2,3,[4,5]]
    >>> j = copy.copy(i)
    
    >>> hex(id(i)), hex(id(j))
    >>> ('0x102b9b7c8', '0x102971cc8') #Both addresses are still different
    
    >>> hex(id(i[3])), hex(id(j[3]))
    >>> ('0x10296f908', '0x10296f908') #Nested lists have same address
    
    >>> i[3].append(6)
    >>> j
    >>> [1,2,3,[4,5,6]] #Updation of original nested list updated the copy as well
    

    Flat list example using deepcopy:

    >>> import copy
    >>> i = [1,2,3]
    >>> j = copy.deepcopy(i)
    >>> hex(id(i)), hex(id(j))
    >>> ('0x102b9b7c8', '0x102971cc8') #Both addresses are different
    
    >>> i.append(4)
    >>> j
    >>> [1,2,3] #Updation of original list didn't affected copied variable
    

    Nested list example using deepcopy:

    >>> import copy
    >>> i = [1,2,3,[4,5]]
    >>> j = copy.deepcopy(i)
    
    >>> hex(id(i)), hex(id(j))
    >>> ('0x102b9b7c8', '0x102971cc8') #Both addresses are still different
    
    >>> hex(id(i[3])), hex(id(j[3]))
    >>> ('0x10296f908', '0x102b9b7c8') #Nested lists have different addresses
    
    >>> i[3].append(6)
    >>> j
    >>> [1,2,3,[4,5]] #Updation of original nested list didn't affected the copied variable    
    

提交回复
热议问题