O que são objetos mutáveis e imutáveis no Python3?

Connor Brereton Blocked Unblock Seguir Seguindo 10 de janeiro O Smart Snake src: https://goo.gl/images/ybWJo5

Python é uma linguagem de programação interpretada (interpretada em C) que foi escrita em 1991 por Guido van Rossum, que enfatiza simplicidade, legibilidade e flexibilidade .

Muitos programadores usam hoje o Python3 por causa de sua implementação original na linguagem de programação procedural C. Por causa disso, ele foi cunhado como CPython.

Sua Santidade – Guido van Rossum

Nota: Durante grande parte deste artigo, vou comparar o Python ao C, já que o C é o “primeiro princípio” do Python. Se você não está familiarizado com os conceitos básicos de C, eu recomendo que você faça isso de antemão ou o Google alguns dos conceitos que surgirem 🙂

O Python funciona bem com o desenvolvimento ágil porque é relativamente rápido conseguir que um aplicativo seja construído e enviado. Além disso, quando se trata de alterar recursos no aplicativo, é mais fácil retrabalhar seu código para adicionar recursos aos usuários em comparação com outras linguagens procedurais. Diferentemente do C, onde é necessário compilar seu código atualizado toda vez que for necessário testar, editar e testar o código recém-atualizado é muito mais rápido com o Python. O Python também oferece o benefício da digitação dinâmica sobre C, já que é uma linguagem tipada estaticamente. Nas linguagens tipificadas estaticamente, quando se declara uma variável, deve-se especificar o tipo de variável (isto é , inteiro, caractere, matriz, etc. ).

Por exemplo:

int phone_number = 4155555555

Agora, só podemos manipular as variáveis com dados semelhantes.

phone_number = 4156666666

Por exemplo, isso não funcionaria:

phone_number = “string”

Como o Python é uma linguagem digitada dinamicamente, os tipos de variáveis não precisam ser especificados por palavra. Um nome de variável é apenas um nome que pode ser vinculado a qualquer tipo de objeto. Essa é a beleza da programação orientada a objetos. Muito facilmente, você pode atribuir um nome a outro objeto de tipo diferente sem nenhuma especificação extra.

Por exemplo, todos são perfeitamente válidos no Python3

>>> phone_number = 4155555555

>>> phone_number = [415, 555, 5555]

>>> phone_number = "connors_phone_number"

id () vs. type ()

Duas das funções internas mais notáveis do Python, id () e type () , são algumas das funções mais úteis quando se trata de inspecionar dados. Eles retornam um inteiro constante e exclusivo e o tipo de um objeto, respectivamente. O id de um objeto representa a identidade da instância do objeto que, no CPython, é o endereço de memória em que esse objeto é armazenado. Portanto, id() é implementado para retornar o endereço do objeto na memória. Isso é muito parecido com o uso do operador & em uma variável para retornar o endereço dessa variável na memória do seu computador.

Vamos continuar examinando ..

type(object) retorna o tipo de um objeto e é geralmente o mesmo objeto retornado pelo object.__class__ .

Por favor, note que os objetos de classe, como mostrado acima, não são seguros para usar o operador is e é altamente recomendado que um use a comparação == vez disso.

Em uma linguagem de programação orientada a objetos, como o Python, é possível definir um novo tipo definindo uma nova classe. O Python já tem muitas classes internas nativas, como:

  • inteiros (ex: x = 3)
  • flutuadores (ex: x = 3,14)
  • strings (ex: x = "oi")
  • listas (ex: x = [1, 2, 3])
  • dicionário (ex: x = {“chave”: valor})
  • etc.

Tipos mutáveis vs. imutáveis

Os tipos internos do Python podem ser divididos em duas categorias principais – tipos mutáveis e imutáveis . Mutabilidade é apenas uma maneira sofisticada de especificar se um objeto pode ser modificado depois de ter sido declarado.

Tipos mutáveis

Os tipos mutáveis do Python incluem:

Listas e dicionários são tipos excelentes para usar quando você sabe que os dados do usuário vão crescer com o tempo devido às suas características de mutabilidade. Como resultado, eles são muito usados em aplicativos de negócios do mundo real.

Os objetos de lista oferecem muitos métodos internos (uma função que pertence a uma classe de objeto e suas instâncias), como append() e pop() que adicionam e removem elementos de lista do final de uma lista.

Vamos pedir comida em um restaurante da OOP:

Você começa com um pedido vazio:

order = []

Vamos inspecionar alguns desses atributos rapidamente, apenas para ter certeza de que temos uma lista:

>>> type(order)
<class 'list'>

>>> id(order)
140201387356936

Em seguida, o servidor vem e pedimos alguns itens:

>>> order.append(“steak”, “salad”, “potatoes”)
>>> order
['steak', 'salad', 'potatoes']

OH ESPERE! Nós não queremos batatas regulares, queremos batata-doce!

>>> order.pop()
>>> order
['steak', 'salad']
>>> order.append("sweet potaters")
>>> order
['steak', 'salad', 'sweet potaters']
>>> id(order)
140201387356936

Delicioso Orientação a Objetos!

Como você pode ver, podemos executar métodos na lista. Isso não retorna uma nova lista, mas altera (altera) a lista original. No final, nossas duas chamadas para id(cart) retornam o mesmo cart prova inteiro para ser a mesma lista antes e depois das invocações de método de lista. Esta é uma característica dos tipos mutáveis no Python.

Tipos imutáveis

Algumas das do Python incluem:

  • inteiros (ex: x = 3)
  • flutuadores (ex: x = 3,14)
  • strings (ex: x = "Hello")
  • tuplas (ex: x = (20, 4))
  • intervalos (ex: intervalo (6)
  • booleanos (ex: x = True)

Tipos imutáveis não suportam modificações, daí o nome imutável. Então, quando tipos imutáveis são alterados (concatenação de string, por exemplo), o Python retornará uma nova instância de um objeto de string para ser atribuído a um nome de variável.

Link para demonstração: https://goo.gl/F4z3nM

Resultado do PythonTutor.com

Em conclusão, id(string) muda depois que nós concatenamos nossa string devido à natureza imutável do próprio objeto. Se fosse de fato mutável, id(string) não seria um número diferente.

Você pode estar dizendo para si mesmo – "ok, mas e se eu apenas atualizar o índice dessa string como em .. C .."

Não ? tão ? rápido ? nós não podemos ? fazer ? aquele ? cara!

 >>> name = "guido" 
>>> nome [0] = 'G'
Traceback (última chamada mais recente):
Arquivo "<stdin>", linha 1, em <module>
TypeError: o objeto 'str' não suporta a atribuição de itens

De cima, podemos ver que isso não é suportado por um objeto imutável e obtemos um TypeErro r que é um lembrete de que objetos 'str' são imutáveis e não suportam a atribuição de itens.

Preste atenção aqui

Isso é muito importante, porque o Python trata os objetos mutáveis e imutáveis de maneira diferente. Se você não acompanhar as qualidades de ambos, isso poderá levar a bugs inesperados. Tome o seguinte exemplo:

 >>> conta_balanço = 1000000 
>>> balance_to_transfer = account_balance
>>> conta_balanço = 2000000
>>> balance_to_transfer
1000000

Obviamente, os sistemas bancários não são tão simples, mas você começa a entender … se você não sabe os tipos com os quais está trabalhando, pode cometer alguns erros sérios em seus aplicativos que podem levar a custosas.

Texto original em inglês.