Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Muita gente fica confusa com esse comportamento do Python ao passar listas por parâmetro.
Quando você altera uma lista dentro de uma função, como com append ou extend, a lista original lá fora é alterada. Isso acontece porque a lista é passada por referência, ou seja, a função trabalha com o mesmo objeto na memória.
Por outro lado, se você reatribui o parâmetro a uma nova lista, como items = ["x", "y"], isso só muda a referência local na função. A lista fora da função continua a mesma, porque a reatribuição não afeta o objeto original. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
---
O ponto aqui é entender que Python passa os objetos por referência, mas a reatribuição do parâmetro dentro da função não altera a referência original. Então, se seu objetivo é modificar a lista original, use métodos que alterem o objeto, não reatribua o parâmetro. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Você já passou por essa situação na prática? Como costuma lidar com ela no seu código? Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Exato, e na hora de refatorar código, entender essa diferença evita criar bugs difíceis de rastrear. Aqui no meu time, sempre reforçamos esse conceito pra galera.
Sim isso pega muita gente de surpresa no comeco. Acho que uma dica boa e sempre pensar que a lista e um objeto mutavel e as reatribuicoes criam uma nova referencia so na funcao.
Isso me pega em projetos grandes, pq às vezes o time não tem clareza se uma função vai modificar ou não uma lista. Acho que documentação e testes ajudam mutio nisso.
Na minha experiência, o maior problema é quando reatribui e acha que tá alterando a lista original. Aí vem o bug difícil de encontrar. Essa dica de usar métodos mutáveis ajuda bastante.