1. ホーム
  2. スクリプト・コラム
  3. パイソン

[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。

2022-01-10 21:54:05

質問

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

ゲームの内容は こちら .

解決方法は?

Python 2のコードベースをPython 3で実行しようとしています。 xrange() にリネームされました。 range() は、Python 3 で使用されました。

代わりにPython 2でゲームを実行してください。何をやっているのか分からない限り、移植しようとしないでください。 xrange() vs. range() .

ちなみに、あなたが見ているのは構文エラーではなく、実行時例外です。


もしあなたが自分のしていることを理解していて、積極的に Python 2 のコードベースを Python 3 と互換性のあるものにしようとしているならば、グローバル名を range . (ただし かもしれない を更新する必要があります。 range() を Python 2 のコードベースで使用し、それを list(range(...)) を使えば、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(...))

の使用をすべて置き換えるか xrange(...)range(...) をコードベースに追加し、Python 3 の構文を Python 2 と互換にするために別の shim を使用します。

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の構文を使う方が簡単です。