2016-08-22 10 views
3
number=26 
for n in range(101): 
    if n is number: 
     print(n, "This is the magic number") 
     break 
    else: 
     print(n) 

上記のコードは完全に実行されますが、以下のように変数と範囲を変更すると正しく動作しません。一般的にPython forループの範囲を変更するコードを変更する

number=260 
for n in range(300): 
    if n is number: 
     print(n, "This is the magic number") 
     break 
    else: 
     print(n) 
+0

これは特に優れた複製ではありません。それはなぜ2番目が失敗するのか説明しますが、なぜ最初のものが失敗したのか説明しません。 – chepner

答えて

4

x == yx is yも真であることを保証するものではありません真であること。最初のコードでは、CPythonの特定の最適化を利用しています。ここでは、小さな整数(-5〜257の間)をあらかじめ割り当てておくことで、そのような整数の使用には常に同じオブジェクトが使用されます。

一般に、リテラルが同じオブジェクトを参照するとは決して考えるべきではありません。インタプリタは、リテラルの使用ごとに新しいオブジェクトを自由に割り当てることができます。

+1

優れた答え。その上に構築するために、私は 'is'と '=='演算子の違いを説明すると思った。 'a == b'かどうかを尋ねると、aの値がbの値と等しいかどうかを調べるのに対して、 'a is b'かどうかを尋ねるときは、aとbが同じものかどうかを尋ねるPythonインタプリタの視点は、メモリ内の同じものを指し示すaとbの2つの異なる名前です)。 [こちら](http://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is-in-python)も参照してください。 – gowrath

+1

私は質問者に疑念の恩恵を与えています。彼らはすでに '=='と 'is'の違いを知っています(発見するために多くの研究をしないので)。リテラルは常に同じオブジェクトを参照すると仮定することは合理的ですが、Pythonではそうではありません。 – chepner

関連する問題