Python Introducing Lists Using Lists Mutability

perix
perix
795 Points

Why does Craig copy the inventory without assigning a name to the copy?

At the end of the video, Craig uses this line of code:

for item in inventory.copy()
    inventory.remove(item)

And when he accesses the inventory, there's nothing on the list.

>>> inventory
[]

Why did he made a copy if when accessing the Inventory(non copy) ,the for loop removed the items anyway ? And, if there's a way to access the copy that he made, how do you access it?

Also, why did he NOT assign a name to the copy so he could access it ?

1 Answer

Dave StSomeWhere
Dave StSomeWhere
19,771 Points

Good questions, sounds like you are paying attention, and this will be on a challenge :thumbsup:

Why did he made a copy if when accessing the Inventory(non copy) ,the for loop removed the items anyway ? And, if there's a way to access the copy that he made, how do you access it?

Because removing items from a list your are iterating over will mess up the index (that's the concept being demonstrated)

Also, why did he NOT assign a name to the copy so he could access it ?

He doesn't need to access the copy. Only the for loop needs the copy, so a named isn't needed.

Here's some code to modify and test, that might help solidify the concepts:

inventory = ['item1', 'item2', 'item3']
inventory2 = ['2item1', '2item2', '2item3']
inventory3 = ['3item1', '3item2', '3item3']

print("\nLoop with copy list --> ", inventory, "\n")
for item in inventory.copy():
    print('in loop item is ', item)
    print('    inventory is ', inventory)
    inventory.remove(item)

print("\ninventory after loop ", inventory)

print("\nLoop with copy list --> ", inventory2, "\n")
for item in inventory2:
    print('in loop item is ', item)
    print('    inventory2 is ', inventory2)
    inventory2.remove(item)

print("\ninventory2 after loop", inventory2)

print("\nLoop with named copy list --> ", inventory3, "\n")
inventory3_copy = inventory3.copy()
for item in inventory3_copy:
    print('in loop item is ', item)
    print('    inventory3_copy is ', inventory3_copy)
    print('    inventory3 is ', inventory3)
    inventory3.remove(item)

print("\ninventory3 after loop ", inventory3)
print("\ninventory3_copy after loop ", inventory3_copy)

# output
Loop with copy list -->  ['item1', 'item2', 'item3'] 

in loop item is  item1
    inventory is  ['item1', 'item2', 'item3']
in loop item is  item2
    inventory is  ['item2', 'item3']
in loop item is  item3
    inventory is  ['item3']

inventory after loop  []

Loop with copy list -->  ['2item1', '2item2', '2item3'] 

in loop item is  2item1
    inventory2 is  ['2item1', '2item2', '2item3']
in loop item is  2item3
    inventory2 is  ['2item2', '2item3']

inventory2 after loop ['2item2']

Loop with named copy list -->  ['3item1', '3item2', '3item3'] 

in loop item is  3item1
    inventory3_copy is  ['3item1', '3item2', '3item3']
    inventory3 is  ['3item1', '3item2', '3item3']
in loop item is  3item2
    inventory3_copy is  ['3item1', '3item2', '3item3']
    inventory3 is  ['3item2', '3item3']
in loop item is  3item3
    inventory3_copy is  ['3item1', '3item2', '3item3']
    inventory3 is  ['3item3']

inventory3 after loop  []

inventory3_copy after loop  ['3item1', '3item2', '3item3']
perix
perix
795 Points

Ok, I get it. You're telling me you shouldn't remove an item from a list that is doing a for loop because it messes the indexes of the items, right?

About the copy, why does the remove function mess up the indexes of the items unless it is in a copy?