Como vimos, no python, temos os seguintes tipos de variáveis:
int
, float
, complex
)str
)bool
)list
)dict
)range
)set
) tuple
)Na atribuição, atribui-se um valor à uma variável, o que quer dizer que um espaço da memória representado pela variável, armazenará o valor designado.
$$ \underbrace{a}_{\rm{nome \ da \ variável}} \leftarrow \rm{expressão} $$Para atribuição:
1a
)var a
).O sinal de =
é empregado para atribuição (mas não é equação).
Vale ressaltar que:
1º - ele faz a conta da expressão
2º - atribui o valor à variável
Na conta da expressão, ele pode usar a própria variável, caso já tenha um valor atribuído. Vejamos um exemplo:
Exemplo Faça a seguinte sequência
a
o valor de 'engenharia'
a
o valor de a + 'eh legal'
a
Solução:
a = 'engenharia'
a = a + ' eh legal'
print(a)
O resultado será:
engenharia eh legal
Exemplo
1-) Faça a seguinte sequência:
a
o valor de 5.a
$
\leftarrow $ a + 1
.a
Solução:
a = 5
a = a + 1
print(a)
Em Python, para atribuição, é importante sabermos se são mutáveis ou não. Ao definir:
a = define-se algum tipo de variável
b = a
Ao mudar b
, se houver compartilhamento de referência, a
também muda, pois ambas estão associadas ao mesmo espaço de memória. As variáveis mutáveis irão compartilhar a referência, enquanto para as imutáveis inicialmente há compartilhamento de referência, mas ao mudar a variável b
, ele cria uma cópia da variável em outro espaço da memória; assim, a
não muda.
As variáveis mutáveis e imutáveis estão ilustradas a seguir.
Tipos de variáveis | Comportamento |
---|---|
list , dict , set , bytearray |
Modificar b também modifica a |
int , float , bool , str , tuple , frozenset , range |
Compartilha referência inicialmente; mudança cria novo objeto |
Para se evitar o compartilhamento de referências, deve-se fazer uma cópia da variável. Há algumas formas de fazê-lo:
1. Usar .copy()
(para listas, dicionários e conjuntos)
Cria uma cópia rasa (cópia de 1º nível):
# para listas
lista = [1, 2, 3]
copia = lista.copy()
# para dicionários
dicionario = {"a": 1, "b": 2}
copia = dicionario.copy()
# para conjuntos
conjunto = {1, 2, 3}
copia = conjunto.copy()
*2. Usar list(), dict(), set() para recriar o objeto
# para listas
lista = [1, 2, 3]
copia = list(lista)
# para dicionários
dicionario = {"a": 1}
copia = dict(dicionario)
# para conjuntos
conjunto = {1, 2}
copia = set(conjunto)
3. Usar deepcopy
para objetos aninhados
Se o objeto tem estruturas internas mutáveis (listas dentro de listas, dicionários dentro de listas, etc.), você precisa de uma cópia profunda.
import copy
lista = [[1, 2], [3, 4]]
copia = copy.deepcopy(lista)
Assim, até os objetos internos são copiados independentemente.
Uma atribuição simples refere-se
x = 10
nome = "Ana"
Esta forma atribui vários valores de uma só vez, conforme ilustrado a seguir:
a, b = 1, 2
Tendo variáveis a
e b
já conhecidas, pode-se trocar os valores das variáveis com o código a seguir:
a, b = b, a
Atribui elementos de variáveis iteráveis. As principais variáveis iteráveis são list
, tuple
, str
, set
, frozenset
, dict
e range
. Pode-se desempacotar as variáveis como os exemplos que seguem:
# para listas
valores = [1, 2, 3]
x, y, z = valores
# para strings
valores = "abc"
a, b, c = valores
# para conjuntos. Neste caso, a,b,c não necessariamente respeitam a ordem 7,8,9, pois conjuntos não guardam ordem de elementos
valores = {7, 8, 9}
a, b, c = valores
# para conjuntos ordenados
valores = frozenset([10, 11, 12])
a, b, c = valores
# para dicionários (neste caso, o que se retorna é a chave do dicionário)
valores = {"x": 100, "y": 200, "z": 300}
a, b, c = valores
print(a) # 'x'
print(b) # 'y'
print(c) # 'z'
# tuplas
valores = (4, 5, 6)
a, b, c = valores
# para ranges
valores = range(1, 4)
a, b, c = valores
print(a) # 1
print(b) # 2
print(c) # 3
Pode-se atribuir um mesmo valor à várias variáveis de uma só vez.
x = y = z = 0