NameError: o nome global 'xrange' não está definido no Python 3

299

Estou recebendo um erro ao executar um programa python:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 110, in <module>
  File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 27, in __init__
  File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\class\inventory.py", line 17, in __init__
builtins.NameError: global name 'xrange' is not defined

O jogo é daqui .

O que causa esse erro?

Pip
fonte

Respostas:

571

Você está tentando executar uma base de código Python 2 com o Python 3. xrange()foi renomeada para range()no Python 3.

Execute o jogo com o Python 2. Não tente porta-lo se você não sabe o que está fazendo, provavelmente haverá mais problemas além xrange()vs. range().

Para o registro, o que você está vendo não é um erro de sintaxe, mas uma exceção de tempo de execução.


Se você sabe o que está fazendo e está ativamente tornando uma base de código Python 2 compatível com o Python 3, você pode conectar o código adicionando o nome global ao seu módulo como um alias para range. (Leve em consideração que pode ser necessário atualizar qualquer range()uso existente na base de código do Python 2 list(range(...))para garantir que você ainda obtenha um objeto de lista no Python 3):

try:
    # Python 2
    xrange
except NameError:
    # Python 3, xrange is now named range
    xrange = range

# Python 2 code that uses xrange(...) unchanged, and any
# range(...) replaced with list(range(...))

ou substitua todos os usos de xrange(...)com range(...)na base de código e use um calço diferente para tornar a sintaxe do Python 3 compatível com o Python 2:

try:
    # Python 2 forward compatibility
    range = xrange
except NameError:
    pass

# Python 2 code transformed from range(...) -> list(range(...)) and
# xrange(...) -> range(...).

O último é preferível para bases de código que desejam ser compatíveis com Python 3 apenas a longo prazo; é mais fácil usar a sintaxe do Python 3 sempre que possível.

Martijn Pieters
fonte
8
Obrigado por observar a diferença entre erro de sintaxe e exceção de tempo de execução. Aprendeu algo novo!
Pithikos
17

adicione xrange=rangeseu código :) Funciona para mim.

Frost Xu
fonte
7
Como foi dito na resposta aceita, não faça isso, é provável que haja outros problemas. Basta executar esse código em python 2.
RobinFrcd
2
@ Frost Xu ... considere o comentário de Robin Fourcade e remova sua resposta. É um IDE para iniciantes e você não quer começar a mergulhar profundamente na depuração e aprender apenas sobre as mudanças do python 2/3. Tipo cintura do seu tempo.
ZF007 07/02
10

Resolvi o problema adicionando esta importação
Mais informações

from past.builtins import xrange
Andrés Gutiérrez
fonte
1
-------------------------------------------------- ------------------------- ModuleNotFoundError Traceback (última chamada mais recente) <ipython-input-21-bcd3600b3604> em <module> () - -> 1 de past.builtins importar xrange 2 para i em xrange (10): 3 impressão (i) ModuleNotFoundError: no módulo chamado 'passado'
rsc05
2

no python 2.x, xrange é usado para retornar um gerador enquanto range é usado para retornar uma lista. No python 3.x, o xrange foi removido e o range retorna um gerador como o xrange no python 2.x. Portanto, no python 3.x, você precisa usar range em vez de xrange.

Ahmad Farhan
fonte
1

Substituir

Python 2 xrange para

Python 3 range

Descanse tudo igual.

Harry_pb
fonte
0

Concordo com a última resposta.Mas existe outra maneira de resolver esse problema.Você pode fazer o download do pacote chamado future, como o pip install future.E no arquivo .py, insira "from past.builtins import xrange" .Este método é para a situação em que existem muitas xranges no seu arquivo.

Not Genius
fonte
Este pacote deve ser usado para obter recursos da versão mais recente para a versão mais antiga do python. Não o contrário.
Mcsim #
O que past.builtings.rangefaz é simplesmente definido xrangepara ser uma referência range. Isso é útil ao criar uma base de código poliglota do Python 2/3, mas não é adequada para um projeto existente projetado para funcionar apenas no Python 2.
Martijn Pieters