Python objects are passed by value, where the value is a reference. The line b = a(3)
creates a new object and puts the label b
on it. b
is not the object, it's just a label which happens to be on the object. When you call test(b)
, you copy the label b
and pass it into the function, making the function's local b
(which shadows the global b
) also a label on the same object. The two b
labels are not tied to each other in any way - they simply happen to both be currently on the same object. So the line b = a(10)
inside the function simply creates a new object and places the local b
label onto it, leaving the global b
exactly as it was.