Variables are pointers


Variables in Python are not buckets that contain things, but pointers: variables point to objects.

Let's say we have a variable x which points to a list of 3 numbers:

>>> x = [1, 2, 3]

If we assign y to x, this does something kind of interesting:

>>> y = x
>>> x == y

The variable x is equal to the variable y at this point, x and y also have the same id, meaning they both point to the same memory location.

>>> id(x)
>>> id(y)

This means they both point to the same object. So if we mutate the object x points to (by appending to that list) x will now have 4 in it but so will y!

>>> x.append(4)
>>> x
[1, 2, 3, 4]
>>> y
[1, 2, 3, 4]

The reason this happens is all about the line that we wrote above:

>>> y = x

Assignment statements never copy anything in Python. Assignments take a variable name and point them to an object.

When I say variables are pointers, I mean they're not buckets that contain things.

When you do an assignment, you're pointing the variable name on the left-hand side of the equals sign (y in this case) to whatever object is referenced on the right-hand side of the equals sign (the list that x already happens to point to in this case).

So variables in Python are pointers, not buckets that contain things.