Nos primeiros dias de trabalho como programador Python, todos encontramos tipos diferentes de erros em nosso código, que após algumas horas dolorosas no StackOverflow não são erros, mas os recursos do Python. Abaixo estão os 5 erros mais comuns que os novos programadores de Python cometem. Vamos descobrir um pouco sobre eles para economizar várias horas fazendo perguntas em páginas e grupos no Facebook.
1. Copie dicionários ou listas
Quando você precisa fazer uma cópia de um dicionário ou lista, basta usar o operador de atribuição não é suficiente.
Errado:>>> dict_a = {"name": "John", "address":"221B Baker street"} >>> dict_b = dict_a
Agora, se você alterar ou atualizar o dict_b, o dict_a também será alterado - e tudo isso graças ao operador de atribuição. Usando este operador, você está tentando dizer que dict_b apontará para o mesmo objeto que dict_a.
>>> dict_b["age"] = 26 >>> dict_b {'address': '221B Baker street', 'name': 'John', 'age': 26} >>> dict_a {'address': '221B Baker street', 'name': 'John', 'age': 26} >>>
Correto: use os métodos copy () ou deepcopy ().
>>> dict_c = dict_b.copy() >>> dict_c["location"] = "somewhere" >>> dict_c {'address': '221B Baker street', 'name': 'John', 'age': 26, 'location': 'somewhere'} >>> dict_b {'address': '221B Baker street', 'name': 'John', 'age': 26} >>> dict_a {'address': '221B Baker street', 'name': 'John', 'age': 26} >>>
Veja a diferença entre cópia e cópia em profundidade.2. Teclas do dicionário
Vamos tentar adicionar valores ao dicionário:
>>> dict_a = dict() >>> dict_a {} >>> dict_a[1] = "apple" >>> dict_a[True] = "mango" >>> dict_a[2] = "melon"
Se tentarmos exibir o dicionário na tela, o que veremos?
>>> dict_a {1: 'mango', 2: 'melon'}
O que aconteceu, onde está a chave True?
Deve-se lembrar que a classe booleana herda de número inteiro (inteiros). E um número inteiro equivalente a True é 1; o equivalente False é 0. Portanto, o valor da chave 1 é simplesmente substituído.
>>> isinstance(True, int) True >>> isinstance(False, int) True >>> True == 1 True >>> False == 0 True
3. Atualizando listas ou dicionários
Suponha que você queira adicionar um item a uma lista.
>>> list_a = [1,2,3,4,5] >>> list_a = list_a.append(6) >>> list_a >>>
Ou tentando atualizar o dicionário.
>>> dict_a = {"a" : "b"} >>> dict_a = dict_a.update({"c" : "d"}) >>> dict_a >>>
Agora vamos tentar organizar a lista.
>>> list_b = [2,5,3,1,7] >>> list_b = list_b.sort() >>> list_b >>>
Por que nada sai, o que estamos fazendo de errado?
A maioria dos métodos de contêiner (como classificar, atualizar, acrescentar, adicionar etc.) são otimizados para fins de desempenho - e evitam criar cópias separadas desnecessariamente.
Não tente atribuir o valor de retorno desses métodos a uma variável.
Corretamente: >>> list_a = [1,2,3,4,5] >>> list_a.append(6) >>> dict_a = {"a" : "b"} >>> dict_a.update({"c" : "d"}) >>> dict_a {'c': 'd', 'a': 'b'} >>> list_a.sort() >>> list_a [1, 2, 3, 4, 5, 6]
4. Cordas Internas
Em alguns casos, o Python tenta reutilizar objetos imutáveis existentes. A internação de strings é um desses casos.
>>> a = "gmail" >>> b = "gmail" >>> a is b True
Aqui tentamos criar dois objetos diferentes - strings. Mas quando os testamos quanto à equivalência, verificou-se que eles coincidiam completamente. Isso ocorre porque o Python não criou outro objeto b, mas fez b apontar para o primeiro valor do "gmail".
Todas as cadeias de comprimento 1 são internadas. Linhas que possuem algo diferente de caracteres ASCII, números e sublinhados não serão internadas.
Vamos conferir.
>>> a = "@gmail" >>> b = "@gmail" >>> a is b False
Lembre-se também de que == é diferente do operador is. O operador == verifica se os valores são equivalentes ou não, enquanto o operador is verifica se as duas variáveis se referem ao mesmo objeto.
>>> a = "@gmail" >>> b = "@gmail" >>> a is b False >>> a == b True
Portanto, lembre-se disso ao usar seqüências imutáveis ou os operadores == e is.
5. Os argumentos padrão são avaliados uma vez.
Considere um exemplo:
def func(a, lst=[]): lst.append(a) return lst print(func(1)) print(func(2))
O que você acha que será exibido após duas impressões?
Vamos executar o código.
>>> def func(a, lst=[]): ... lst.append(a) ... return lst ... >>> print(func(1)) [1] >>> print(func(2)) [1, 2]
Por que a segunda saída do caso [1, 2]? Não deveria ser apenas [2]?
Portanto, o problema é que os argumentos padrão são avaliados apenas uma vez.A primeira vez que a função foi chamada, func (1), a lista foi avaliada e percebeu que estava vazia. Isso significa que você pode adicionar 1. Mas na segunda chamada - func (2) - já existe um elemento na lista, portanto [1, 2] é exibido.
Bônus: Não há necessidade de misturar espaços e tabulações. Apenas não.