The fact that several variables have the same id has nothing much to do with the actual objects being immutable.
In fact, this can happen safely (saving memory), due to their immutability.
Let's assume that a string in python was not immutable, you declared:
a = 'abc'
b = 'abc'
If you changed a, that would mean that b would either reference a completely different object (duplicating the memory needed to represent the same literal string), or that, when a was changed, the whole object would have to be copied over in order to make the change (so that b wouldn't be affected).
Since the strings are immutable, both variables can safely point to the same object. Any change to an immutable data structure creates a new structure, and the reference that was pointing towards it is changed to the new one, leaving all other references to the "old" structure unchanged. The absence of side effects in immutable data structures greatly diminishes the possibility of errors occurring due to a shared structure/object being changed somewhere else in your code.
1..id()is not guaranteed to be unique.