2016-12-15 21 views
0

のマッチング、私は次のように簡単なコードを使用してみました:Pythonの文字列は、文字列のリストにいくつかの文字列を排除しようとしているときに

>>> s = ['a b', 'c d', 'e f', 'g h'] 
>>> for i in s: 
...  if i is not 'e f': 
...   print(i) 
... 
a b 
c d 
e f # this should not get printed, right? 
g h 

をし、私は基本的な動作を理解することができませんか。 説明できますか?以下のように論理的であると思われるからです。

>>> if 'a b' is not 'a b': 
...  True 
... else: 
...  False 
... 
False 
>>> s = ['a', 'c', 'e', 'g'] 
>>> for i in s: 
...  if i is not 'e': 
...   print(i) 
... 
a 
c 
g 

は特別扱いのスペースですか?私は何が欠けていますか?

答えて

3

is notは同一性ベースのテストです。文字列で動作するときは、文字列や小さな文字列キャッシュのインターナショナルによるものです。これは決して信頼されるべきではない実装の詳細です。

Noneとの比較を除いて、一般的にはis/is notを使用しないでください。ここで!=を入力してください。tests value(2つのオブジェクトは同じ論理情報を表しますか?)ではis notではなく、tests identity(全く同じオブジェクトを参照していますか?)

これを強制するには、明示的にinternのように何かひどいことをすることができますが、それはすべての文字列を処理しますが、作業を保存することはありません(作業をインターンに費やします)。 。

関連する問題