Start here. This is the direct spoken answer to practice first.
Overview
The useful explanation avoids a pass-by-value versus pass-by-reference slogan and shows the observable behavior of shared objects and local names.
When Python calls a function, each parameter name is bound to the object supplied by the caller. The function does not receive access to rebind the caller's name. If the object is mutable, the function can mutate that shared object and the caller can observe the change. If the function assigns a different object to its parameter, only the local parameter is rebound. This is often called call by sharing or passing an object reference by value.