web-dev-qa-db-ja.com

なぜrange(0)== range(2、2、2)Python 3?

Python 3で異なる値で初期化された範囲が互いに等しいのはなぜですか?

インタープリターで次のコマンドを実行すると:

>>> r1 = range(0)
>>> r2 = range(2, 2, 2)
>>> r1 == r2
True

結果はTrueです。これはなぜですか?異なるパラメーター値を持つ2つの異なるrangeオブジェクトが等しいものとして扱われるのはなぜですか?

50
root

ドキュメント (エンファシス鉱山)からの直接引用:

==および!=を使用して範囲オブジェクトが等しいかどうかをテストすると、それらがシーケンスとして比較されます。つまり、2つの範囲オブジェクトは、値の同じシーケンスを表す場合、等しいと見なされます。 (等しいことを比較する2つの範囲オブジェクトは、start、stop、step属性が異なる場合があることに注意してください。たとえば、range(0)== range(2、1、3)またはrange(0、3、2)== range(0、 4、2)。)

rangesを「同じ」リストと比較すると、 ドキュメント にも記載されているように、不等式になります。

異なる数値型を除く異なる型のオブジェクトは、等しく比較されません。

例:

_>>> type(range(1))
<class 'range'>
>>> type([0])
<class 'list'>
>>> [0] == range(1)
False
>>> [0] == list(range(1))
True
_

これは明示的にPython 3.にのみ適用されることに注意してください。Python 2では、rangeはリストを返すだけで、range(1) == [0]Trueとして評価されます。

13
Jasper

このページの優れた回答にいくつかの詳細を追加するために、2つのrangeオブジェクト_r0_と_r1_が比較されます おおよそ次のように

_if r0 is r1:                 # True if r0 and r1 are same object in memory
    return True
if len(r0) != len(r1):       # False if different number of elements in sequences
    return False
if not len(r0):              # True if r0 has no elements
    return True
if r0.start != r1.start:     # False if r0 and r1 have different start values
    return False
if len(r0) == 1:             # True if r0 has just one element
    return True
return r0.step == r1.step    # if we made it this far, compare step of r0 and r1
_

rangeオブジェクトの長さは、startstop、およびstepパラメーターを使用して簡単に計算できます。たとえば、_start == stop_の場合、Pythonは、長さが0であることをすぐに知ることができます。自明でない場合、Python startstop、およびstepの値を使用して 単純な算術計算 を実行します。

したがって、range(0) == range(2, 2, 2)の場合、Pythonは次のことを行います。

  1. range(0)range(2, 2, 2)はメモリ内の異なるオブジェクトであることがわかります。
  2. 両方のオブジェクトの長さを計算します。両方の長さが0(両方のオブジェクトで_start == stop_であるため)であるため、別のテストが必要です。
  3. len(range(0))が0であることがわかります。これは、len(range(2, 2, 2))も0(以前の不等式のテストが失敗した)であるため、比較がTrueを返すことを意味します。
10
Alex Riley

res = range(0) == range(2, 2, 2)

どこで:

range(0)

0から0-0ステップの範囲(ここでstepはデフォルト値1に等しい)、値なしのリストを意味します。

range(2, 2, 2)

は、2から2までの範囲を意味し、ステップは2に等しく、値なしのリストです。

だから、これらの範囲は本当に等しい

6
pivanchy

range(0)range(0,0)を返します。ステップ1で0から0まで開始します。3番目の引数は0(デフォルト)にできないため、未定義です。 1で0に到達することはできません。カウンターのアクションがないため、0です。

range(2, 2, 2)range(2, 2, 2)を返します。 2から2まで開始しますが、2のステップで開始します。ここでも、何にもカウントされないため、基本的に0です。

range(0) == range(2,2,2) 

Trueexactlyは同じです。

5
喬治扎菲