上記のように、主な理由はあなたのtest
比較です。2つのオブジェクトが等しいかどうかを比較するため、使用は使用is
とは異なります。この場合、IDを確認することで、それらが等しくないことを確認できます。==
import sys
print id(sys.argv[1])
print id('test')
私の出力:
140335994263232
140335994263424
それらは異なるオブジェクトを指しているため、を使用する場合は等しくありませんis
(ただし、を使用==
すると文字列自体が比較され、が返されますTrue
)。
ここでの問題は、インターンの概念です。2つの同一の文字列をソースにハードコーディングすると、文字列はインターンされ、2つはオブジェクトIDを共有します(これは、以下の@SamMussmannの非常に有効なポイントを説明しています)。ただし、を介して文字列を渡すargv
と、新しいオブジェクトが作成され、コード内の同一のハードコードされた文字列との比較が返されますFalse
。私がこれまでに見つけた最も良い説明はここにあります。ここでは、AlexMartelliとJonSkeet(2つの非常に評判の良い情報源)の両方がインターンとストリングがインターンされるときを説明しています。これらの説明から、からのデータargv
はプログラムの外部にあるため、値はインターンされておらず、したがって、両方がソース内のリテラルである場合とは異なるオブジェクトIDを持っているように見えます。
(目前の問題とは関係ありませんが、議論に関連するis
)もう1つの興味深い点は、数値を使用して行われるキャッシングです。-5から256までの数値がキャッシュされます。つまりis
、その範囲内の等しい数値との比較は、計算方法に関係なくTrueになります。
In [1]: 256 is 255 + 1
Out[1]: True
In [2]: 257 is 256 + 1
Out[2]: False
In [3]: -5 is -4 - 1
Out[3]: True
In [4]: -6 is -5 - 1
Out[4]: False