5

Pythonで基本的な前提をテストしようとしていますが、常に失敗し、理由がわかりません。

私のsys.argvは次のようになります。

['test.py', 'test']

そして私のコードは次のようになります:

if len(sys.argv) > 1 and sys.argv[1] is 'test':
    print 'Test mode'

しかし、テストは決して真実ではありません。私はここで本当に単純なものを見逃していると確信していますが、それが何であるかを理解することはできません。

4

1 に答える 1

8

上記のように、主な理由はあなたの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
于 2012-11-22T01:22:22.830 に答える