2017-12-12 8 views
0

「です」でリテラルに文字列を比較する文句:Pylintは、このコードスニペットを考えてみましょう

my_string = 'asdf' 
print(my_string is 'xfje') #R

Pylintは、私がerror message wikiに見つけることができませんでした二行目、上の勧告R0123を返します。それの言及は、しかし、this part of the docsである:

リテラルの比較(R0123):あなたはしたくないものを通常である、リテラルにオブジェクトを比較するときに使用しリテラルに

比較あなたが期待していたものとは異なる文字を比較することができるからです。

この説明は役に立ちません。 2つの文字列オブジェクトの比較にisを使用すると、予想よりも異なる結果になることがありますが、オブジェクトとリテラルを比較すると、==と同じです。 ==を使用すると、エラーが表示されなくなります。

ここでisを使用しないでください。

+0

たぶん、あなたはこのSO [解答](https://stackoverflow.com/questions/2209755/python-operation-vs-is-not)がより有用でしょう。 – kingJulian

+3

"ですが、オブジェクトとリテラルの比較のためには' == '"と同じです - ここであなたはその考えを得ましたか? – user2357112

+0

@ user2357112私はそれをプロンプトで試してみましたが、期待どおりに機能しました。しかし、ええ、私はいかなる書類も読まなかった。 – iFreilicht

答えて

4

isは、左辺の引数がの右辺の引数と同じ参照を保持していることを確認します。これはシングルトンであるNoneでは問題ありませんが、通常、複数のインスタンスが同じ論理値を持つことができる他のタイプの場合は悪い考えです。

次の例:

>>> my_string = ''.join([c for c in 'xfje']) 
>>> print my_string 
xfje 
>>> print my_string == 'xfje' 
True 
>>> print my_string is 'xfje' 
False 
+0

'true'や' false'と 'is'を使って比較するべきではありません。 [ソース](https://www.python.org/dev/peps/pep-0008/#programming-recommendations)(最後の箇条書き) –

+0

@Coal_良い点。これらの例を編集して削除しました。 – Mureinik

関連する問題