tomasyany
tomasyany

Reputation: 1242

Slicing list inside a method (Python 3)

I have a method like the following:

def slice_list(my_list, slice_point):
    my_list = my_list[:slice_point]
    print("Inside method: ", my_list)

    return 

I have a test for it like the following:

if __name__ == "__main__":
    my_list = [1,2,3,4,5]
    slice_point = 3

    slice_list(my_list, slice_point)
    print("Outside method: ", my_list)

The output I get is not what I expected for, in the sense that the list is not ultimately edited

>>>Inside method:  [1, 2, 3]
>>>Outside method:  [1, 2, 3, 4, 5]

But when I do an append to the list, it does edit the list for good, as this example shows:

def append_to_list(my_list, element):
    my_list.append(element)
    print("Inside method: ", my_list)

    return 

if __name__ == "__main__":
    my_list = [1,2,3,4,5]
    append_to_list(my_list, "new element")
    print("Outside method: ", my_list)

Which gives the following output:

>>>Inside method:  [1, 2, 3, 4, 5, 'new element']
>>>Outside method:  [1, 2, 3, 4, 5, 'new element']

Why does the slice not change the list for good?

Upvotes: 2

Views: 80

Answers (1)

wim
wim

Reputation: 362557

Try this instead:

my_list[:] = my_list[:slice_point]

Your old method just points the name my_list at a new object, i.e. at the copy returned by the slice.

The suggestion I've proposed above, however, modifies the object which my_list originally pointed at without rebinding that name.

Upvotes: 3

Related Questions