Conceitos Avançados de Python: Cópias, Conjuntos e Funções

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 & b ou a.intersection(b)
  • União: todos os elementos dos dois conjuntos → a | b ou a.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 ^ b ou a.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()

Tags: Python Sets deep copy shallow copy functions

Publicado em 9-20 11:03