51

在 C# 中,我们可以&&像这样使用 (boolean and):

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 中进行布尔运算?

4

6 回答 6

75

尝试这个:

i = 5
ii = 10
if i == 5 and ii == 10:
      print "i is 5 and ii is 10"

编辑:哦,你不需要最后一行的分号(编辑从我的代码中删除它)。

于 2009-03-04T10:21:37.437 回答
29

正如所指出的,python 中的“&”执行按位与运算,就像它在 C# 中一样。and&&运算符的适当等价物。

由于我们正在处理布尔值(i == 5isTrueii == 10is also 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 与 5 的值是否等于 i 和 10。显然这永远不会是真的。

如果您包含括号来强制优先级,您实际上会得到(看似)正确的答案,所以:

if (i==5) & (ii=10)

将导致打印该语句。这是错误的做法,但是 - " &" 与 " " - 有许多不同的语义and(优先级、短路、带有整数参数的行为等),所以幸运的是你在这里抓住了这一点,而不是被愚弄直到它变得不那么明显错误。

于 2009-03-04T13:52:59.003 回答
16

要使用的正确运算符是关键字“或”和“和”,在您的示例中,表达这一点的正确方法是:

if i == 5 and ii == 10:
    print "i is 5 and ii is 10"

您可以参考语言参考中“布尔运算”部分的详细信息。

于 2009-03-04T10:30:09.630 回答
7

您也可以将它们作为一对进行测试。

if (i,ii)==(5,10):
    print "i is 5 and ii is 10"
于 2009-03-04T12:44:06.063 回答
6

&用于逐位比较。改为使用and。顺便说一句,您不需要在 print 语句的末尾使用分号。

于 2009-03-04T10:22:35.983 回答
6

在 python 中,使用and而不是&&这样:

#!/usr/bin/python
foo = True;
bar = True;
if foo and bar:
    print "both are true";

这打印:

both are true
于 2009-03-04T13:22:37.733 回答