Does for loop call __iter__?

I'm asking to know if for loop itself convert list implicitly then call iter for iteration keeping list without removing like iterator?

The for loop does not convert the list implicitly in the sense that it mutates the list, but it implicitly creates an iterator from the list. The list itself will not change state during iteration, but the created iterator will.

a = [1, 2, 3]
for x in a:
    print(x)

is equivalent to

a = [1, 2, 3]
it = iter(a) # calls a.__iter__
while True:
    try:
        x = next(it)
    except StopIteration:
        break
    print(x)

Here's proof that __iter__ actually gets called:

import random

class DemoIterable(object):
    def __iter__(self):
        print('__iter__ called')
        return DemoIterator()

class DemoIterator(object):
    def __iter__(self):
        return self

    def __next__(self):
        print('__next__ called')
        r = random.randint(1, 10)
        if r == 5:
            print('raising StopIteration')
            raise StopIteration
        return r

Iteration over a DemoIterable:

>>> di = DemoIterable()
>>> for x in di:
...     print(x)
...
__iter__ called
__next__ called
9
__next__ called
8
__next__ called
10
__next__ called
3
__next__ called
10
__next__ called
raising StopIteration