85
if var is 'stringone' or 'stringtwo':
    dosomething()

これは動作しません!私は変数を持っていて、それが値のいずれかであるときに何かをする必要がありますが、if ステートメントに入りません。Javaif (var == "stringone" || "stringtwo")作品で。これをPythonで書くにはどうすればよいですか?

4

5 に答える 5

179

これはあなたが期待することをしません:

if var is 'stringone' or 'stringtwo':
    dosomething()

以下と同じです。

if (var is 'stringone') or 'stringtwo':
    dosomething()

'stringtwo'は「真」の値と見なされるため、これは常に真です。

次の 2 つの方法があります。

if var in ('stringone', 'stringtwo'):
    dosomething()

または、個別の等価テストを作成することもできます。

if var == 'stringone' or var == 'stringtwo':
    dosomething()

はオブジェクトの同一性を比較するisため、は使用しないでください。isJava が多くの文字列をインターンするので、Java で問題を回避できるように、Python が多くの文字列をインターンするため、問題を回避できる場合があります。isただし、オブジェクト ID が本当に必要な場合を除き、使用しないでください。

>>> 'a' + 'b' == 'ab'
True
>>> 'a' + 'b' is 'abc'[:2]
False # but could be True
>>> 'a' + 'b' is 'ab'
True  # but could be False
于 2012-10-08T01:32:20.237 に答える
27
if var == 'stringone' or var == 'stringtwo':
    do_something()

またはよりpythonic、

if var in ['string one', 'string two']:
    do_something()
于 2012-10-08T01:27:11.037 に答える
6
if var == 'stringone' or var == 'stringtwo':
    dosomething()

「is」は、2 つの参照が同じオブジェクトを参照しているかどうかを確認するために使用されます。メモリアドレスを比較します。どうやら、'stringone' と 'var' は異なるオブジェクトで、同じ文字列を含んでいるだけですが、クラス 'str' の 2 つの異なるインスタンスです。もちろん、これらには 2 つの異なるメモリ アドレスがあり、「is」は False を返します。

于 2012-10-08T01:26:47.893 に答える
4

2 つの個別のチェック。また、identity ではなく等価性をチェックする場合は、not を使用==isてください。

 if var=='stringone' or var=='stringtwo':
     dosomething()
于 2012-10-08T01:27:34.413 に答える
0
for a in soup("p",{'id':'pagination'})[0]("a",{'href': True}):
        if createunicode(a.text) in ['<','<']:
            links.append(a.attrMap['href'])
        else:
            continue

わたしにはできる。

于 2014-05-31T09:54:18.697 に答える