This is my second day of learning python (I know the basics of C++ and some OOP.), and I have some slight confusion regarding variables in python.
Here is how I unde
In Python, a variable holds the reference to the object. An object is a chunk of allocated memory that holds a value and a header. Object's header contains its type and a reference counter that denotes the amount of times this object is referenced in the source code so that Garbage Collection can identify whether an object can be collected.
Now when you assign values to a variable, Python actually assigns references which are pointers to memory locations allocated to objects:
# x holds a reference to the memory location allocated for
# the object(type=string, value="Hello World", refCounter=1)
x = "Hello World"
Now when you assign objects of different type to the same variable, you actually change the reference so that it points to a different object (i.e. different memory location). By the time you assign a different reference (and thus object) to a variable, the Garbage Collector will immediately reclaim the space allocated to the previous object, assuming that it is not being referenced by any other variable in the source code:
# x holds a reference to the memory location allocated for
# the object(type=string, value="Hello World", refCounter=1)
x = "Hello World"
# Now x holds the reference to a different object(type=int, value=10, refCounter=1)
# and object(type=string, value="Hello World", refCounter=0) -which is not refereced elsewhere
# will now be garbage-collected.
x = 10
Coming to your example now,
spam holds the reference to object(type=int, value=42, refCounter=1):
>>> spam = 42
Now cheese will also hold the reference to object(type=int, value=42, refCounter=2)
>>> cheese = spam
Now spam holds a reference to a different object(type=int, value=100, refCounter=1)
>>> spam = 100
>>> spam
100
But cheese will keep pointing to object(type=int, value=42, refCounter=1)
>>> cheese
42