NameError: 'xrange' genel adı Python 3'te tanımlanmamış


299

Bir python programı çalıştırırken bir hata alıyorum:

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

Oyun buradan .

Bu hataya ne sebep olur?

Yanıtlar:


572

Python 3 ile bir Python 2 kod tabanı çalıştırmaya çalışıyorsunuz. Python 3 xrange()olarak yeniden adlandırıldı range().

Bunun yerine oyunu Python 2 ile çalıştırın. Eğer ne yaptığınızı bilmedikçe portuna bunu kalkmayın, büyük olasılıkla ötesinde daha fazla sorun olacak xrange()vs. range().

Kayıt için, gördüğünüz sözdizimi hatası değil, çalışma zamanı istisnasıdır.


Ne yaptığınızı biliyorsanız ve Python 3 ile uyumlu bir Python 2 kod tabanı oluşturuyorsanız, genel adı modülünüze takma ad olarak ekleyerek kodu köprüleyebilirsiniz range. ( Python 3'te hala bir liste nesnesi aldığınızdan emin olmak için Python 2 kod tabanındaki mevcut kullanımları güncellemeniz gerekebileceğini dikkate alın ):range()list(range(...))

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(...))

ya da her kullanım yerine xrange(...)ile range(...)kod temeli ve Python 2 Python 3 sözdizimi uyumlu hale getirmek için, farklı bir dolgu kullanımı:

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

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

İkincisi, sadece uzun vadede Python 3 uyumlu olmayı amaçlayan kod tabanları için tercih edilir , daha sonra mümkün olduğunda Python 3 sözdizimini kullanmak daha kolaydır.


8
Sözdizimi hatası ve çalışma zamanı istisnası arasındaki farkı not ettiğiniz için teşekkür ederiz. Yeni bir şey öğrendim!
Pithikos

17

xrange=rangekodunuzu ekleyin :) Bana çalışıyor.


7
Kabul edilen cevapta söylendiği gibi, bunu yapma, muhtemelen başka sorunlar olacak. Bu kodu python 2'de çalıştırın.
RobinFrcd

2
@Frost Xu ... lütfen Robin Fourcade'i yorumunu düşün ve cevabını kaldır. Yeni başlayanlar için bir IDE ve hata ayıklama derin dalış ve sadece python 2/3 değişiklikleri hakkında bilgi edinmek istemiyorum. Zamanınızın beline.
ZF007

10

Bu içe aktarmayı ekleyerek sorunu çözdüm
Daha fazla bilgi

from past.builtins import xrange

1
-------------------------------------------------- ------------------------- ModuleNotFoundError Traceback (en son çağrı son) <module> () içindeki <ipython-input-21-bcd3600b3604> - -> 1 past.builtins i xrange için i xrange 2'yi içe aktar (10): 3 print (i) ModuleNotFoundError: 'past' adlı modül yok
rsc05

2

python 2.x içinde aralık listeyi döndürmek için kullanılırken xrange bir jeneratörü döndürmek için kullanılır. Python 3.x sürümünde , xrange kaldırıldı ve aralık , python 2.x'teki xrange gibi bir jeneratör döndürüyor . Bu nedenle, python 3.x'te xrange yerine aralık kullanmanız gerekir.


1

değiştirmek

Python 2 xrange-

Python 3 range

Hepsi aynı.


0

Son yanıta katılıyorum.Ancak bu sorunu çözmenin başka bir yolu var. Pip install future gibi future adlı paketi indirebilirsiniz. dosyanızda birçok xrange olması durumudur.


Bu paket, yeni sürümün özelliklerini python'un eski sürümüne almak için kullanılır. Başka türlü değil.
mcsim

Ne past.builtings.rangeyapmak basitçe xrangereferans olarak ayarlanır range. Bu, bir Python 2/3 çok dilli kod tabanı oluştururken yardımcı olur, ancak yalnızca Python 2'de çalışmak üzere tasarlanmış mevcut bir proje için uygun değildir.
Martijn Pieters
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.