n = '123'
numeros = []
for i in n: #transformando n em uma lista
numeros.append(i)
# numeros = ['1', '2', '3'], ou seja, numeros é uma lista com três elementos, cada um sendo uma string
for i in numeros:
numeros = int(numeros[i])
print(type(numeros[0]))
lista[indice] o índice precisa ser um inteiro, mas você está passando os elementos de numeros (que são strings).
Sugestão de alteração:
n = '123'
numeros = []
for i in n: #transformando n em uma lista
numeros.append(i)
for elemento in numeros: # OBS*
elemento = int(elemento)
print(type(numeros[0]))
OBS: elemento pode ter qualquer nome, só não coloquei i porque muitos iniciantes associam essa letra com ÍNDICE.
for i in lista percorre iterando os ELEMENTOS da lista, não os ÍNDICES.
editado
Mil perdões Gabriel. O código acima não converte os elementos de numeros em inteiro. Para isso, podemos usar a função enumerate() para acessar índice e elemento, ficando assim:
for indice, elemento in enumerate(numeros):
numeros[indice] = int(elemento)
Ou ainda usando list comprehensions no lugar do for:
n = '123'
numeros = []
for i in n: #transformando n em uma lista
numeros.append(i)
numeros = [int(elemento) for elemento in numeros]
print(type(numeros[0]))
Peço desculpas mais uma vez.
Mais sobre: