Cópias Profundas e Superficiais em Python
Em Python, o método .copy() realiza uma cópia superficial (shallow copy), que apenas duplica os elementos do nível mais externo. Isso significa que, se os elementos internos forem mutáveis (como listas ou dicionários), as alterações feitas no objeto copiado afetarão o original.
original = [1, 'a', 'b']
shallow_copy = original.copy()
original[0] = 2
print(shallow_copy) # Saída: [1, 'a', 'b'] — não é afetado porque os elementos são imutáveis
nested_list = [[1, 2, 3], 2, 3]
shallow_copy_nested = nested_list.copy()
nested_list[0][0] = 999
print(shallow_copy_nested) # Saída: [[999, 2, 3], 2, 3] — afetado por causa da referência interna
Para evitar esse comportamento, use copy.deepcopy(), que cria uma cópia completa, incluindo todos os objetos aninhados:
import copy
husband_account = ['Hugo', '0001', [15000, 10000]]
mistress_account = copy.deepcopy(husband_account)
mistress_account[0] = 'Mistress'
mistress_account[1] = '0002'
mistress_account[2][1] -= 1000
print(husband_account) # Não muda
print(mistress_account) # Alterações isoladas
Conjuntos (Sets) – Coleções Únicas e Operações Lógicas
Os conjuntos são coleções desordenadas e não repetidas. A criação é feita com set() a partir de sequências.
s = set('hello world!')
print(s) # {'h', 'e', 'l', 'o', ' ', 'w', 'r', 'd', '!'} — elimina duplicatas
Operações comuns entre conjuntos:
- Interseção: elmeentos comuns entre dois conjuntos →
a & boua.intersection(b) - União: todos os elementos dos dois conjuntos →
a | boua.union(b) - Diferença: elemantos presentes em um mas não no outro →
a - b - Diferença simétrica: elementos exclusivos de cada conjunto →
a ^ boua.symmetric_difference(b)
a = {1, 2, 3, 4, 5}
b = {4, 5, 6, 7, 8}
print(a & b) # {4, 5}
print(a | b) # {1, 2, 3, 4, 5, 6, 7, 8}
print(a - b) # {1, 2, 3}
print(a ^ b) # {1, 2, 3, 6, 7, 8}
Funções com Parâmetros Variáveis
Funções podem aceitar argumentos arbitrários usando *args para valores posicionais e **kwargs para chaves-valor.
def calculate_total(*values, **options):
total = sum(values)
print(f"Valores: {values}")
print(f"Opções: {options}")
return total
calculate_total(10, 20, 30, discount=5, tax=10)
# Saída:
# Valores: (10, 20, 30)
# Opções: {'discount': 5, 'tax': 10}
Retorno de Valores e Escopo
Uma função retorna None por padrão se não houver instrução return. Quando múltiplos valores são retornados, eles são empacotados como uma tupla.
def get_stats():
return 42, "sucesso", True
result = get_stats()
print(result) # (42, 'sucesso', True)
Controle de escopo com global e nonlocal:
counter = 10
def outer():
local_counter = 50
def inner():
nonlocal local_counter
local_counter += 1
print(local_counter) # 51
inner()
print(local_counter) # 51
outer()