NameError: il nome globale 'xrange' non è definito in Python 3


299

Ricevo un errore durante l'esecuzione di un programma 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

Il gioco è di qui .

Cosa causa questo errore?

Risposte:


571

Stai tentando di eseguire una base di codice Python 2 con Python 3. è xrange()stato rinominato range()in Python 3.

Esegui invece il gioco con Python 2. Non cercare di porta a meno che non si sa cosa si sta facendo, molto probabilmente ci saranno più problemi al di là xrange()vs. range().

Per la cronaca, quello che stai vedendo non è un errore di sintassi ma un'eccezione di runtime.


Se sai cosa stai facendo e stai attivamente rendendo una base di codice Python 2 compatibile con Python 3, puoi collegare il codice aggiungendo il nome globale al tuo modulo come alias per range. (Prendere in considerazione che si può avere di aggiornare le esistenti range()uso nella base di codice Python 2 con list(range(...))al fine di garantire ancora ottenere un oggetto di lista in 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(...))

o sostituisci tutti gli usi di xrange(...)con range(...)in codebase e quindi usa uno shim diverso per rendere la sintassi di Python 3 compatibile con Python 2:

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

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

Quest'ultimo è preferibile per codebase che vogliono mirare ad essere compatibili con Python 3 solo a lungo termine, è più semplice usare la sintassi di Python 3 ogni volta che è possibile.


8
Grazie per aver notato la differenza tra errore di sintassi ed eccezione di runtime. Ho imparato qualcosa di nuovo!
Pithikos,

17

aggiungi il xrange=rangetuo codice :) Funziona per me.


7
Come si dice nella risposta accettata, non farlo, è probabile che ci saranno altri problemi. Basta eseguire quel codice in Python 2.
RobinFrcd

2
@Frost Xu ... considera Robin Fourcade il suo commento e rimuovi la tua risposta. È un IDE per principianti e non vuoi iniziare a immergerti nel debug e conoscere solo le modifiche di Python 2/3. Kinda vita del tuo tempo.
ZF007,

10

Ho risolto il problema aggiungendo questa importazione
Altre informazioni

from past.builtins import xrange

1
-------------------------------------------------- ------------------------- ModuleNotFoundError Traceback (ultima chiamata più recente) <ipython-input-21-bcd3600b3604> in <module> () - -> 1 da past.builtins import xrange 2 for i in xrange (10): 3 print (i) ModuleNotFoundError: nessun modulo chiamato 'past'
rsc05

2

in Python 2.x, xrange è usato per restituire un generatore mentre range è usato per restituire un elenco. In python 3.x, xrange è stato rimosso e range restituisce un generatore proprio come xrange in python 2.x. Pertanto, in Python 3.x è necessario utilizzare range anziché xrange.


1

Sostituire

Python 2 xrange a

Python 3 range

Riposati tutti uguali.


0

Sono d'accordo con l'ultima risposta. Ma c'è un altro modo per risolvere questo problema. Puoi scaricare il pacchetto chiamato future, come pip install future. E nel tuo file .py inserisci questo "from past.builtins import xrange". Questo metodo è per la situazione che ci sono molti xrange nel tuo file.


Questo pacchetto da utilizzare per ottenere le funzionalità della versione più recente alla versione precedente di Python. Non diversamente.
mcsim,

Quello che past.builtings.rangefa è semplicemente impostato xrangeper essere un riferimento a range. Ciò è utile quando si crea una base di codice poliglotta Python 2/3, ma non è adatto per un progetto esistente progettato per funzionare solo su Python 2.
Martijn Pieters
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.