The id of an object is guaranteed to be persistent for the lifetime of the object. So it would violate the specification of the id function if this list's id changed, and you only created one list so there aren't two list objects with different ids.
The way this works in practice is that the list object itself stays in the same memory location, but it holds a (private) reference to the backing array. When the array's capacity needs to change, a new backing array is created and the contents are copied across. The list object's (private) reference is updated to point at the new backing array, but the list object itself hasn't been relocated in memory.
I have written a longer explanation of how this works, including an interactive example which shows box-and-pointer diagrams of the list object and the backing array. You may find this helpful to understand what is actually happening in memory when the backing array is resized.