Variable Passing in Python
2021.12.29 To be updated after machine structure is learnt
Source: A very good graphical explanation
We think of varible x = [1, 2]
using a box-pointer diagram, where x
points to a box containing a pointer to the list object [1, 2]
.
-
The box represents the content of that piece of memory set aside for x. Any piece of memory has an address and contains some content.
-
The pointer between
x
and the box means the address of that box, and the fact thatx
points to that box means "x
is bound to the address of that piece of memory set aside". -
The pointer contained in the box means the address
of the[1, 2]
object.
Passing by value
b = a
passing by value creates a deep copy of whatever is inside a
's memory, and puts them in a new box. In our case, it copies the list [1, 2]
, and puts the address of that newly created [1, 2]
to a new box bound to b
.
When passed by value, neither reassignment nor mutation to
b
affectsa
.
Passing by reference
b = a
passing by reference simply associates b
with a
's address.
When passed by reference, both reassignment and mutation to
b
affecta
.
Passing by object reference
b
is associated with a new address, but the object address contained in a
is copied and put in the new address. So b
and a
are associated with different addresses, but contain the same pointer.
When passed by object reference, reassignment to
b
doesn’t affecta
, but mutation tob
is reflected ona
.