Je crois avoir capté ton problème .
En gros, cette boucle :
for l in range(len(g)):
for c in range(1,len(g[l])):
if 0==g[l][c-1]:
g[l][c-1]=g[l][c]
g[l][c]=0
elif g[l][c]==g[l][c-1]:
g[l][c-1]=(g[l][c])*2
g[l][c]=0
Te permet de "tout décaler" vers la gauche de 1 cran. Or cette instruction tu la répète (len(g)-1) fois, donc dans ton exemple, 3 fois. Du coup quand tu exécute ton code, ta liste va prendre ces valeurs :
[[2, 2, 2, 2],[2, 2, 2, 2],[2, 2, 2, 2],[2, 2, 2, 2]]
t = 0 <= (len(g)-1)
[[4, 0, 4, 0],[4, 0, 4, 0],[4, 0, 4, 0],[4, 0, 4, 0]]
t = 1 <= (len(g)-1)
[[4, 4, 0, 0],[4, 4, 0, 0],[4, 4, 0, 0],[4, 4, 0, 0]]
t = 2 <= (len(g)-1)
[[8, 0, 0, 0],[8, 0, 0, 0],[8, 0, 0, 0],[8, 0, 0, 0]]
t = 3 <= (len(g)-1)
[[8, 0, 0, 0],[8, 0, 0, 0],[8, 0, 0, 0],[8, 0, 0, 0]]
t = 4 condition n'est plus vérifiée, arret de l'algo.
Voila ![[[sticker:p/1kki]]](https://image.jeuxvideo.com/stickers/p/st/1kki)