Everything from a string to a class is an object in Python. And every Object is defined by Identity, Type and Value.
Identity – refers to the location of the object in the computers memory (ie. id: 4358658568)
Type – is it a number or a string or a function? (possible types in Python include: str, int, float, list, tuple, dict, class, type, function)
Value – is the value of the object (ie. a string could be „Hello“ or a number could be 3.14)
The id or the memory-location is not particularly useful in Python compared to other languages where you might have to
free the memory manually. When a Python program exits it clears all the used memory by itself – Python is a good sport so to speak.
Memory Management in other languages can be a bit of a pain in the elbow.
But you can learn a lot about the lifespan and behavior of objects such as strings when you know their ID – just look at the following code:
name = "robb" # name gets a value "robb"
name2 = name # name2 gets the value of name which is "robb"
# even though they are two different variables, they share the same id or memory slot
print(id(name)) # id: 4374158280
print(id(name2)) # id: 4374158280
name2 = "adrian" # change name2 to "adrian"
# the id of name stays the same, while name2 gets a new id as expected
print(id(name)) # id: 4374158280
print(id(name2)) # id: 4375412952
name = name2 # change name to the value of name2, which is "adrian"
#they both have the same id again
print(id(name)) # id: 4375412952
print(id(name2)) # id: 4375412952
name = "robb" # changing name back to its original value
print(id(name)) # id: 4374158280 <--It's the same ID again as it was in the first place (line 6) - crazy!
print(id(name2)) # id: 4375412952
I would have assumed that name gets a new id in the end, since we re-change the value to „robb“
but Python apparently remembers „Aha – we had that value before and gives the id of the memory
location back to the name-variable – it’s a neat way of managing memory space…
The above only works for immutable types though – a new or changed value changes the id.
(Immutable types are strings, integers, floats and tuples.)
Mutables types on the other hand, like lists or dictionaries, can change their value and
will still keep their original id. Just look at this:
a_list = ["robb", "adrian"] # we generate a list that holds two values
print(id(a_list)) # id: 4383824392
a_list.append("linus") # we include another value to the list
print(id(a_list)) # id: 4383824392 <-- the value stays the same
del a_list[:] # clear the list of all values
a_list.append("sara") # enter a new value
print(id(a_list)) # id: 4383824392 <-- still the same.