Não Yan, não me refiro dentro do while, me refiro ao final do código, deixa eu formular melhor minha dúvida.
Quando iniciamos o código o python passa inicializando todas as funções e no final executa o comando menu() que faz com que o python entre dentro da função menu, la dentro ele cria a lista vazia "nomes = []" até ai ok, mas agora suponhamos que eu digite 1 para entrar na função cadastrar, o python vai até a função cadastrar, eu faço tudo lá dentro e no final(como não tem return nem nada) ele sai da função e corre todo o programa de novo até chegar lá em baixo e se deparar com "menu()" novamente. Minha dúvida é, pq q pela segunda vez q ele passa por "menu()" ao entrar na função menu a lista nomes não é sobreposta por "nomes = []", pois quando eu estou dentro de outra função, por exemplo listar, quando eu chamo a função menu() a lista é sobreposta, mas quando o propio programa faz isso não, minha dúvida é essa.
Pq todas as vezes ele executa "escolha = ' ' "(tanto q entramos dentro do while novamente), mas é como não executasse "nomes = []"
Espero ter sido mais claro agora, caso ainda tenha dúvida tente executar o código a seguir e veja que como há um "menu()" você irá conseguir listar porem da próxima vez q tentar chamar a função listar ela iria retornar uma lista vazia.
def listar(nomes):
print'Listando nomes'
for nome in nomes:
print nome
menu()
def cadastrar(nomes):
print 'Digite o nome'
nomes.append(raw_input())
def menu():
nomes = []
escolha = ''
while(escolha != '0'):
print '1 para cadastrar - 0 para terminar'
escolha = raw_input()
if(escolha == '1'):
cadastrar(nomes)
if(escolha == '2'):
listar(nomes)
if(escolha == '3'):
remover(nomes)
menu()