Mecanismos de Internação, Cópias e Conjuntos em Python

Em desenvolvimento Python, existem diferenças importantes entre ambientes como o PyCharm e a linha de comando. O PyCharm opera com blocos de código, enquanto a linha de comando utiliza um sistema de pools de dados para otimização.

  1. Mecanismo de Internação

O mecanismo de internação permite que objetos idênticos compartilhem o mesmo endereço de memória, economizando recursos. Este comportamento é controlado por regras específicas:

  • Números: Apenas valores entre -5 e 256 são internados automaticamente.
  • Strings: São internadas quando possuem conteúdo idêntico (excluindo caracteres chineses e especiais), independetnemente do tamanho.
  • Em Python 3.6, strings resultantes de operações de multiplicação não podem exceder 20 caracteres.
  • Em Python 3.7, esse limite é aumentado para 4096 caracteres.
  • Valores booleanos (True/False) são sempre internados.

O benefício principal desse mecanismo é a economai de memória e o aumento de eficiência.

  1. Operadores de Comparação

É fundamental distinguir entre os operadores is e ==:

  • is verifica se dois objetos referenciam o mesmo endereço de memória.
  • == verifica se o conteúdo de dois objetos é igual.
  1. Atribuição, Cópia Rasa e Cópia Profunda

Atribuição

Na atribuição, múltiplas variáveis podem apontar para o mesmo endereço de memória. Qualquer alteração afeta todas as referências.

Cópia Rasa (Shallow Copy)

A cópia rasa duplica apenas o primeiro nível de elementos. Elementos mutáveis compartilham o mesmo endereço de memória.

Cópia Profunda (Deep Copy)

A cópia profunda cria novas instâncias para todos os elementos, incluindo aninhados, garantindo total independência entre os objetos originais e copiados.

Exemplos Práticos:

# Exemplo de atribuição
lista_original = [1, 2, 3, [4, 5], 6]
lista_referencia = lista_original
lista_original.append(7)
print(lista_original)  # [1, 2, 3, [4, 5], 6, 7]
print(lista_referencia)  # [1, 2, 3, [4, 5], 6, 7]

# Exemplo de cópia rasa
lista_original = [1, 2, 3, [4, 5], 6]
lista_copia_rasa = lista_original.copy()
lista_original.append(7)
print(lista_original)  # [1, 2, 3, [4, 5], 6, 7]
print(lista_copia_rasa)  # [1, 2, 3, [4, 5], 6]

# Modificando elemento mutável na cópia rasa
lista_original[-2].append(9)
print(lista_original)  # [1, 2, 3, [4, 5, 9], 6, 7]
print(lista_copia_rasa)  # [1, 2, 3, [4, 5, 9], 6]

# Exemplo de cópia profunda
import copy
lista_original = [1, 2, 3, [4, 5], 6]
lista_copia_profunda = copy.deepcopy(lista_original)
lista_original.append(7)
lista_original[-2].append(9)
print(lista_original)  # [1, 2, 3, [4, 5, 9], 6, 7]
print(lista_copia_profunda)  # [1, 2, 3, [4, 5], 6]

  1. Conjuntos em Python

Características Principais:

  • Remoção automática de duplicatas
  • Elmeentos devem ser imutáveis (hashable)
  • Desordenados e mutáveis
  • Iteráveis

Operações Básicas:

# Criação de conjunto
conjunto_vazio = set()
conjunto = {1, 2, 3, 4, 4, 3, 2, 1}  # {1, 2, 3, 4}

# Remoção de duplicatas de lista
lista_com_duplicatas = [11, 11, 11, 22, 33, 44, 55]
lista_unicos = list(set(lista_com_duplicatas))  # [33, 11, 44, 22, 55]

# Adicionando elementos
conjunto.add("novo_elemento")
conjunto.update(["outra", "lista"])

# Removendo elementos
elemento_removido = conjunto.pop()  # Remove elemento aleatório
conjunto.remove("elemento_especifico")  # Remove elemento específico
conjunto.clear()  # Esvazia o conjunto

# Operações entre conjuntos
conjunto_a = {1, 2, 3, 4}
conjunto_b = {3, 4, 5, 6}

# União
print(conjunto_a | conjunto_b)  # {1, 2, 3, 4, 5, 6}

# Interseção
print(conjunto_a & conjunto_b)  # {3, 4}

# Diferença
print(conjunto_a - conjunto_b)  # {1, 2}

# Diferença simétrica
print(conjunto_a ^ conjunto_b)  # {1, 2, 5, 6}

# Verificação de subconjuntos
print(conjunto_a.issubset(conjunto_b))  # False
print(conjunto_a.issuperset(conjunto_b))  # False

  1. Aplicações Práticas

Exemplo: Gerenciador de Compras

# Dicionário de produtos
produtos = [
    {"nome": "Notebook", "preco": 1999},
    {"nome": "Mouse", "preco": 10},
    {"nome": "Barco", "preco": 20},
    {"nome": "Serviço", "preco": 998}
]

# Sistema de compras
saldo = float(input("Informe o valor a depositar: "))
carrinho = {}
compras_realizadas = []

while True:
    # Exibir produtos
    print("\nProdutos disponíveis:")
    for i, produto in enumerate(produtos, 1):
        print(f"{i}. {produto['nome']} - R${produto['preco']:.2f}")
    
    # Seleção do usuário
    opcao = input("\nEscolha um produto (N para finalizar, S para sair): ").upper()
    
    if opcao == 'S':
        break
    elif opcao == 'N':
        # Finalizar compra
        total = sum(item["preco"] * item["quantidade"] for item in carrinho.values())
        
        if total > saldo:
            print(f"\nSaldo insuficiente! Total: R${total:.2f}, Saldo: R${saldo:.2f}")
            # Remover itens do carrinho
            while total > saldo and carrinho:
                print("\nItens no carrinho:")
                for nome, info in carrinho.items():
                    print(f"- {nome}: {info['quantidade']} x R${info['preco']:.2f}")
                
                item_remover = input("Informe o item para remover: ")
                if item_remover in carrinho:
                    if carrinho[item_remover]["quantidade"] > 1:
                        carrinho[item_remover]["quantidade"] -= 1
                    else:
                        del carrinho[item_remover]
                    
                    total = sum(item["preco"] * item["quantidade"] for item in carrinho.values())
        else:
            # Compra realizada
            saldo -= total
            compras_realizadas.append(carrinho.copy())
            carrinho = {}
            print(f"\nCompra realizada! Novo saldo: R${saldo:.2f}")
    elif opcao.isdigit() and 1 <= int(opcao) <= len(produtos):
        # Adicionar produto ao carrinho
        produto_selecionado = produtos[int(opcao) - 1]
        nome = produto_selecionado["nome"]
        
        if nome in carrinho:
            carrinho[nome]["quantidade"] += 1
        else:
            carrinho[nome] = {
                "preco": produto_selecionado["preco"],
                "quantidade": 1
            }
        
        print(f"{nome} adicionado ao carrinho!")
    else:
        print("Opção inválida!")

Exemplo: Jogo do Sete


Tags: Python copia-de-dados Conjuntos mecanismo-de-internacao

Publicado em 6-26 04:16