Reputation: 1242
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
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