Oii Lucas, tudo bem?
Quando queremos utilizar o condicional if e else dentro de uma compreensão de lista, por padrão, essa condição deve vir em primeira instância, como mostro abaixo:
[x if <condição_um> else <condição_dois> for <item> in <lista>]
No seu exemplo, se alterarmos a ordem que a condicional foi colocada, teremos o resultado esperado:
palavra_secreta = "Frase composta".upper()
lista_teste = [" " if letra == " " else "_" for letra in palavra_secreta]
print(lista_teste)
Resultado:
['_', '_', '_', '_', '_', ' ', '_', '_', '_', '_', '_', '_', '_', '_']
Porém, quando temos apenas o condicional if, por padrão, ele virá após o laço de repetição:
[x for <item> in <lista> if <condição>]
Exemplo onde queremos selecionar apenas os números pares da lista.
lista_numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9]
numeros_pares = [par for par in lista_numeros if par % 2 == 0]
Resultado:
[2, 4, 6, 8]
Caso queira mergulhar ainda mais nesse assunto, recomendo o seguinte artigo:
O artigo está em inglês, mas caso tenha dificuldade com o idioma, recomendo o uso do tradutor do navegador.
Fico à disposição em caso de dúvidas.
Abraços e bons estudos.
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!