NameError:グローバル名 'xrange'はPython 3で定義されていません


299

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

ゲームはここからです

このエラーの原因は何ですか?

回答:


571

Python 3でPython 2コードベースを実行しようとしています。Python3でxrange()に名前が変更されrange()ました。

代わりにPython 2でゲームを実行してください。あなたは何をしているか知っている限り、最も可能性の高い超えて多くの問題があるだろう、ポートにそれをしようとしないでくださいxrange()range()

記録として、表示されているのは構文エラーではなく、ランタイム例外です。


あなたが何をしているのかがわかっていて、Python 2コードベースをPython 3と互換性があるように積極的に作成している場合は、グローバル名をモジュールのエイリアスとしてモジュールに追加することにより、コードをブリッジできますrange。(Python 3でリストオブジェクトを確実に取得するために、Python 2コードベースの既存の使用を更新する必要がある場合があることを考慮してください):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(...))

またはのすべての使用を置き換えるxrange(...)range(...)コードベースで、その後のPython 2とPythonの3構文が互換性を持たせるために別のシムを使用します。

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

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

後者は、長期的にのみ Python 3互換を目指したいコードベースに適しています。可能な限り、Python 3構文を使用する方が簡単です。


8
構文エラーとランタイム例外の違いにご注意いただきありがとうございます。新しいことを学びました!
ピティコス2014年

17

xrange=rangeあなたのコードに追加してください:)それは私にはうまくいきます。


7
受け入れられた回答で述べられているように、それは行わないでください。他の問題が発生する可能性があります。ただ、パイソン2でそのコードを実行します
RobinFrcd

2
@Frost Xu ... Robin Fourcadeのコメントを検討して、回答を削除してください。初心者向けのIDEであり、デバッグの詳細に踏み込んでPython 2/3の変更についてのみ学ぶ必要はありません。あなたの時間のちょっと腰。
ZF007 2018

10

私は、このインポートに追加することで問題を解決し
より多くの情報を

from past.builtins import xrange

1
-------------------------------------------------- ------------------------- ModuleNotFoundErrorトレースバック(最新の呼び出しが最後)<ipython-input-21-bcd3600b3604> in <module>()- -> 1 from past.builtins import xrange 2 for i in xrange(10):3 print(i)ModuleNotFoundError: 'past'という名前のモジュールなし
rsc05

2

python 2.xでは、xrangeを使用してジェネレータを返し、rangeを使用してリストを返します。python 3.xでは、xrangeが削除され、範囲はpython 2.xのxrangeと同じようにジェネレーターを返します。したがって、python 3.xでは、xrangeではなくrangeを使用する必要があります。


1

交換する

Python 2 xrangeから

Python 3 range

すべて同じように残ります。


0

最後の回答に同意します。ただし、この問題を解決する別の方法があります。pipinstall futureなどのfutureという名前のパッケージをダウンロードできます。.pyファイルに「from past.builtins import xrange」から入力します。この方法あなたのファイルに多くのxrangesがある状況のためです。


このパッケージは、新しいバージョンから古いバージョンのPythonの機能を取得するために使用されます。他の方法ではありません。
mcsim 2017年

何をするかpast.builtings.rangeは、単にxrangeへの参照になるように設定されているだけrangeです。これは、Python 2/3ポリグロットコードベースを作成するときに役立ちますが、Python 2でのみ動作するように設計されている既存のプロジェクトには適していません。
Martijn Pieters
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.