Okay, let me try to explain this way.
Everything in Python is pretty much a reference and a reference is something that if you have, you can manipulate it and do anything, add elements, remove elements, alter elements, etc.
Think like an e-mail. If you know the password of an e-mail, you'll be able to manipulate it and do whatever you want it.
A reference to a list is just like an e-mail password, if you have that you can do many, many things.
In the example above, the argument food will hold the reference of the list shopping_list so either if you work with shopping_list or food, you'll get the same output.
Here's a screenshot of a code I wrote as an example:
Here's the code too:
listA = [1,2,3,4,5]
listB = [17,65,34,25]
print "I'm the argument who has the reference of list A: ", argList
print "I'm the actual list A: ", listA
print "Okay, now I'll try to print list B :D"
print "What? I can't print list B ?! Aww :("
The first line of our code has a list named listA declared with those values from 1 to 5.
Since we declared that outside any other function, we call this "structure" global and due to that, any function or variable will be able to use it, following the correct instructions when it comes to list manipulation, and do anything you'd like to do, depends on the purpose of your code.
Since our listA is global and we have created it way before calling a function with it will be able to manipulate it inside of that function.
Did you see that either printing the argument argList and listA we got the exact same values? Considering we didn't change anything, of course.
But notice that at line 04 we created another list named listB and we tried to print that out on the outside but it didn't work... why?
The thing is: variables and structures that have been created inside of a function scope will only exist while this function exists and can only be used inside of those same functions.
That means if you try to print listB outside of the function exampleFunction() we would cause an error, the compiler would throw an exception and inform us that:
name 'listB' is not defined
because that exact same was created in another scope.
In that case, if we want to print that out, there are some ways to do it:
1. Use return and return listB from the function exampleFunction()
2. Use another function inside of that same function to get listB and on the other function, return it.
After returning, we would just need to store that return inside of another variable and that same variable will have the reference of listB and guess what? It will be the same idea of the argument food and the list shopping_list.
If I wasn't clear, let me know and I'll explain in a different way, okay?
Edit: check this site if you have more doubts about scopes and things related: A Beginner’s Guide to Python’s Namespaces, Scope Resolution, and the LEGB Rule