---
title: "Diferenças Entre Python 2 e Python 3"
url: "https://python.dev.br/perguntas/diferenca-python2-python3/"
markdown_url: "https://python.dev.br/perguntas/diferenca-python2-python3.MD"
description: "Entenda as diferenças entre Python 2 e Python 3. Por que Python 2 foi descontinuado, mudanças na sintaxe e como migrar projetos antigos"
date: "2025-12-03"
author: ""
---

# Diferenças Entre Python 2 e Python 3

Entenda as diferenças entre Python 2 e Python 3. Por que Python 2 foi descontinuado, mudanças na sintaxe e como migrar projetos antigos


## Quais as diferenças entre Python 2 e Python 3?

Python 3 é a versão atual e ativa da linguagem, enquanto Python 2 foi oficialmente descontinuado em 1 de janeiro de 2020. Se você está começando a programar, use Python 3 sem hesitação. Este artigo existe para ajudar quem encontra código antigo em Python 2 ou precisa entender as diferenças por contexto histórico.

## Breve histórico

Python 3.0 foi lançado em dezembro de 2008, mas a transição foi lenta porque Python 3 não era compatível com Python 2. Muitas bibliotecas importantes demoraram anos para se adaptar. A Python Software Foundation manteve o Python 2 em paralelo até 2020, dando à comunidade mais de uma década para migrar.

Hoje, praticamente todas as bibliotecas relevantes suportam apenas Python 3. Não há motivo para usar Python 2 em projetos novos.

## Principais diferenças

### Print: função vs declaração

A mudança mais visível e que mais identifica código antigo:

```python
# Python 2
print "Ola, mundo!"
print "Nome:", nome

# Python 3
print("Ola, mundo!")
print("Nome:", nome)
```

Em Python 3, `print` é uma função e requer parênteses. Isso também permite recursos como `end` e `sep`:

```python
# Apenas em Python 3
print("Processando", end="... ")
print("Concluido!")
# Saida: Processando... Concluido!

print("a", "b", "c", sep=" -> ")
# Saida: a -> b -> c
```

### Divisão inteira

```python
# Python 2
print 5 / 2    # Resultado: 2 (divisao inteira!)
print 5.0 / 2  # Resultado: 2.5

# Python 3
print(5 / 2)   # Resultado: 2.5 (divisao real)
print(5 // 2)  # Resultado: 2 (divisao inteira explicita)
```

Em Python 2, a divisão entre dois inteiros retornava um inteiro, descartando o resto. Isso causava bugs sutis e difíceis de encontrar. Python 3 corrigiu esse comportamento, fazendo a divisão retornar um float por padrão.

### Strings e Unicode

Esta é a mudança mais importante internamente:

```python
# Python 2
texto = "Ola"           # tipo str (bytes)
texto_unicode = u"Ola"  # tipo unicode

# Python 3
texto = "Ola"           # tipo str (unicode por padrao!)
texto_bytes = b"Ola"    # tipo bytes (explicito)
```

Em Python 2, strings eram sequências de bytes por padrão, e caracteres especiais como acentos causavam problemas frequentes. Python 3 tornou todas as strings Unicode por padrão, resolvendo décadas de problemas com codificação de caracteres.

Para brasileiros, isso significa que acentos e caracteres especiais como "ã", "ç" e "é" funcionam sem configuração adicional em Python 3:

```python
# Python 3 - funciona perfeitamente
nome = "João da Conceição"
print(nome.upper())  # JOAO DA CONCEICAO
```

### Input

```python
# Python 2
nome = raw_input("Seu nome: ")  # Retorna string
numero = input("Um numero: ")    # Avalia a expressao (perigoso!)

# Python 3
nome = input("Seu nome: ")      # Sempre retorna string
numero = int(input("Um numero: "))  # Converter explicitamente
```

Em Python 2, `input()` executava o que o usuário digitasse como código Python, o que era um risco de segurança. Python 3 unificou o comportamento: `input()` sempre retorna uma string.

### Range

```python
# Python 2
range(10)     # Cria uma lista [0, 1, 2, ..., 9] na memoria
xrange(10)    # Gera valores sob demanda (lazy)

# Python 3
range(10)     # Gera valores sob demanda (equivalente ao xrange)
list(range(10))  # Se precisar da lista explicitamente
```

Python 3 tornou `range()` preguiçoso (lazy) por padrão, economizando memória. O `xrange()` não existe mais.

### Exceções

```python
# Python 2
try:
    algo()
except ValueError, e:    # Sintaxe antiga
    print e

# Python 3
try:
    algo()
except ValueError as e:  # Sintaxe com 'as'
    print(e)
```

Python 3 também introduziu encadeamento de exceções com `raise ... from ...`:

```python
try:
    valor = int(texto)
except ValueError as e:
    raise RuntimeError("Formato invalido") from e
```

### Dicionários

```python
# Python 2
d = {"a": 1, "b": 2}
d.keys()    # Retorna lista
d.values()  # Retorna lista
d.items()   # Retorna lista de tuplas

# Python 3
d = {"a": 1, "b": 2}
d.keys()    # Retorna view (nao cria lista)
d.values()  # Retorna view
d.items()   # Retorna view
```

Views são mais eficientes em memória e refletem mudanças no dicionário em tempo real. Se precisar de uma lista, use `list(d.keys())`.

Outra mudança importante: em Python 3.7+, dicionários mantêm a ordem de inserção. Em Python 2, a ordem era arbitrária.

### Type hints

Python 3.5+ introduziu type hints, que não existem em Python 2:

```python
# Python 3
def calcular_media(notas: list[float]) -> float:
    return sum(notas) / len(notas)

def buscar_usuario(id: int) -> dict | None:
    # ...
    pass
```

### F-strings

Outra funcionalidade exclusiva do Python 3.6+:

```python
# Python 2
nome = "Python"
print("Linguagem: %s" % nome)
print("Linguagem: {}".format(nome))

# Python 3.6+
nome = "Python"
print(f"Linguagem: {nome}")
print(f"2 + 2 = {2 + 2}")
```

### Walrus operator

Python 3.8 introduziu o operador `:=`:

```python
# Python 3.8+
if (n := len(dados)) > 10:
    print(f"Lista grande com {n} elementos")
```

## Como identificar código Python 2

Sinais claros de que o código é Python 2:

- `print` sem parênteses: `print "texto"`
- `raw_input()` em vez de `input()`
- `xrange()` em vez de `range()`
- `except Erro, e:` em vez de `except Erro as e:`
- `#!/usr/bin/env python` no topo (em vez de `python3`)
- Uso frequente de `u"string"` para Unicode

## Migrando de Python 2 para 3

Se você precisa migrar código antigo, use a ferramenta `2to3`:

```bash
# Ver as mudancas sugeridas
2to3 meu_script.py

# Aplicar as mudancas automaticamente
2to3 -w meu_script.py
```

A ferramenta `2to3` converte a maioria das diferenças sintáticas automaticamente, mas pode não cobrir diferenças semânticas mais sutis.

## Conclusão

Python 3 é a versão definitiva do Python. Todas as diferenças em relação ao Python 2 foram melhorias: Unicode por padrão, divisão consistente, print como função, type hints e f-strings. Se você encontrar material didático que use Python 2, procure uma versão atualizada. Todo projeto novo deve usar Python 3, e projetos antigos em Python 2 devem ser migrados, pois não recebem mais correções de segurança desde 2020.

Linguagens modernas como <a href="https://golang.com.br/blog/" target="_blank" rel="noopener" onclick="umami.track('portfolio-site-click', {source: 'python.dev.br', target: 'golang.com.br', content: 'diferenca-python2-python3'})">Go</a> e <a href="https://rustlang.com.br/blog/" target="_blank" rel="noopener" onclick="umami.track('portfolio-site-click', {source: 'python.dev.br', target: 'rustlang.com.br', content: 'diferenca-python2-python3'})">Rust</a> foram projetadas desde o início com Unicode nativo e tipagem forte — conceitos que o Python 3 incorporou em sua evolução.
