Search code examples
pythonpass-by-value

Pass list to function by value


I want to pass a list into function by value. By default, lists and other complex objects passed to function by reference. Here is some desision:

def add_at_rank(ad, rank):
    result_ = copy.copy(ad)
    .. do something with result_
    return result_

Can this be written shorter? In other words, I wanna not to change ad.


Solution

  • You can use [:], but for list containing lists(or other mutable objects) you should go for copy.deepcopy():

    lis[:] is equivalent to list(lis) or copy.copy(lis), and returns a shallow copy of the list.

    In [33]: def func(lis):
        print id(lis)
       ....:     
    
    In [34]: lis = [1,2,3]
    
    In [35]: id(lis)
    Out[35]: 158354604
    
    In [36]: func(lis[:])
    158065836
    

    When to use deepcopy():

    In [41]: lis = [range(3), list('abc')]
    
    In [42]: id(lis)
    Out[42]: 158066124
    
    In [44]: lis1=lis[:]
    
    In [45]: id(lis1)
    Out[45]: 158499244  # different than lis, but the inner lists are still same
    
    In [46]: [id(x) for x in lis1] = =[id(y) for y in lis]
    Out[46]: True
    
    In [47]: lis2 = copy.deepcopy(lis)  
    
    In [48]: [id(x) for x in lis2] == [id(y) for y in lis]  
    Out[48]: False