HOWTO · Python
NameError: 名前 'xrange' が Python で定義されていません
Python3 で xrange 関数を呼び出すとエラーが発生する理由を学び、この問題を修正する方法を確認します。 また、range と xrange の違いを学び、さまざまな Python バージョンで range 関数を使用する方法を確認します。
Python3 で xrange() 関数を呼び出すとエラーが発生する理由を学び、この問題を修正する方法を確認します。 また、range() と xrange() の違いを学び、異なる Python バージョンで range() 関数を使用する方法を確認します。
NameError: name 'xrange' is not defined xrange() 関数を使用する場合 Python3
Python2 から Python3 への移行の大部分は、Python3 に xrange() 関数が存在しなくなったことです。 Python2 と Python3 を並べて使用して比較し、両方のバージョンの Python での range() と xrange() の違いを確認します。
まず、xrange() 関数を使用できる Python2 環境を使用しますが、Python2 環境には range() 関数もあります。 これらの関数の動作がわずかに異なることがわかります。 xrange() は xrange() オブジェクトを返し、range() はリストを返します。
Python3 では、range() 関数は range() オブジェクトを返しますが、Python2 では range() 関数はリストを返します。 基本的に、xrange() はジェネレーターであり、range() も Python3 のジェネレーターです。
ここで、Python2 に焦点を当てましょう。 まず、この xrange() オブジェクトを少し調べてみたいと思います。
オブジェクトの型と、xrange オブジェクトがあるかどうかを確認します。
type(xrange(6))
出力
<type 'xrange'>
次に、リストをラップするとどうなるかを見ていきます。
list(xrange(6))
出力
[0, 1, 2, 3, 4, 5]
次に、xrange(6) を a という名前の変数に割り当て、range() オブジェクトを作成し、それを b 変数に割り当てます。 a と b の両方のサイズを取得するために sys をインポートします。
このコードを Python シェルで実行すると、両方の変数のサイズに大きな違いがあることがわかります。
>>> import sys
>>> a=xrange(6)
>>> b=range(6)
>>> sys.getsizeof(a)
32
>>> sys.getsizeof(b)
112
xrange() オブジェクトのサイズは range() よりも小さいため、xrange() は range() よりも高速です。
Python3 は xrange() 関数をサポートしていないため、実行速度が速いため、初心者は通常、Python3 で xrange() 関数を使用しようとするとエラー (name 'xrange' is not defined) が発生します。
# in python 3
xrange(6)
出力:
NameError: name 'xrange' is not defined
Python3 では、xrange() オブジェクトは range() オブジェクトになりました。
# in python 3
>>> range(6)
range(0, 6)
sys をインポートして、Python3 のリストと range() オブジェクトのサイズを確認してみましょう。
# in python 3
>>> a=range(6)
>>> b=[0,1,2,3,4,5]
>>> import sys
>>> sys.getsizeof(a)
48
>>> sys.getsizeof(b)
152
リストに匹敵する 48 を取得しました。 Python2 の xrange() と Python3 の range() は、おそらく同様の速度で実行され、メモリ内で同様の容量を消費することがわかります。
Python3 環境では、前述のように xrange() が存在しないため、xrange() 関数を使用できません。 Python3 に組み込まれることはありませんでした。 xrange() の代わりに range() 関数を使用できます。これは、range() 関数が Python3 ではるかに高速であるためです。