C#では、次のように&&
(ブール型)を使用できます。
int i = 5;
int ii = 10;
if(i == 5 && ii == 10) {
Console.WriteLine("i is 5, and ii is 10");
}
Console.ReadKey(true);
しかし、Pythonでそれを試してください:
i = 5
ii = 10
if i == 5 && ii == 10:
print "i is 5 and ii is 10";
エラーが表示されます:SyntaxError: invalid syntax
単一の&
を使用すると、少なくとも構文エラーは発生しません。 Pythonで&&
ブール値を実行するにはどうすればよいですか?
これを試して:
i = 5
ii = 10
if i == 5 and ii == 10:
print "i is 5 and ii is 10"
編集:ああ、最後の行にセミコロンは必要ありません(編集してコードから削除します)。
指摘したように、C#の場合と同様に、pythonの "&"はビット単位の演算を実行します。and
は&&
演算子に相当します。
ブール値(i == 5
はTrue
であり、ii == 10
はTrue
でもある)を扱っているため、なぜこれが機能しないのか疑問に思うかもしれません(True整数量として扱われる場合でも、TrueおよびTrueはTrue値を意味する)、または例外をスローする(たとえば、ブール型のビットごとの操作を禁止する)
その理由は、演算子の優先順位です。 「and
」演算子は==
よりも緩やかにバインドするため、式「i==5 and ii==10
」は「(i==5) and (ii==10)
」と同等です。
ただし、ビット単位の&
の優先順位は「==
」よりも高くなっています(「a & 0xff == ch
」のような式は「a & (0xff == ch)
」を意味しないため)式は実際には次のように解釈されます。
if i == (5 & ii) == 10:
これは、Pythonの演算子チェーンを使用して意味しています:ii andedの5の値はiと10の両方に等しくなります。明らかにこれは決して真実ではありません。
優先順位を強制する括弧を含めた場合、実際には(一見)正しい答えが得られます。
if (i==5) & (ii=10)
ステートメントが印刷されます。しかし、それは間違ったことです-「&
」は「and
」とは異なるさまざまなセマンティクスを持っています-(優先順位、ショートサーキット、整数引数での振る舞いなど)、あなたが捕まったのは幸運ですこれは、明らかなバグが少なくなるまでだまされるのではなく、ここで行います。
使用する正しい演算子は、キーワード「or」および「and」です。この例では、これを表す正しい方法は次のとおりです。
if i == 5 and ii == 10:
print "i is 5 and ii is 10"
詳細は、言語リファレンスの 「ブール演算」セクション で参照できます。
カップルとしてテストすることもできます。
if (i,ii)==(5,10):
print "i is 5 and ii is 10"
&
はビット単位の比較に使用されます。代わりにand
を使用してください。ところで、printステートメントの最後にセミコロンは必要ありません。
Pythonでは、次のように&&
の代わりにand
を使用します。
#!/usr/bin/python
foo = True;
bar = True;
if foo and bar:
print "both are true";
これは印刷します:
both are true