我对何时应该使用布尔运算符还是按位运算符感到困惑。
and
vs &
or
vs |
有没有人能告诉我,我什么时候使用它们,什么时候使用它们会影响我的结果?
发布于 2010-10-02 16:56:33
以下是一些指导原则:
短路行为在如下表达式中很有用:
if x is not None and x.foo == 42:
# ...
使用按位&
运算符时,这将无法正常工作,因为将始终计算两端,从而得到AttributeError: 'NoneType' object has no attribute 'foo'
。使用布尔型and
运算符时,如果第一个表达式为False,则不会计算第二个表达式。类似地,如果第一个参数为真,则or
不会计算第二个参数。
发布于 2010-10-02 17:16:23
理论上,and
和or
直接来自布尔逻辑(因此对两个布尔值进行操作以产生布尔值),而&
和|
将布尔and /或应用于整数的各个位。关于后者到底是如何工作的,这里有很多问题。
以下是可能会影响您的结果的实际差异:
and
和or
短路,例如True or sys.exit(1)
不会退出,因为对于第一个操作数(True or ...
,False and ...
)的某个值,第二个操作数不会更改结果,因此不需要计算。但是|
和&
不会让你走投无路-- True | sys.exit(1)
把你踢出了REPL.&
,|
是常规运算符,可以被重载,而and
和or
则被伪造到语言中(尽管强制布尔值的特殊方法可能会有副作用)。这也适用于带有运算符overloading的其他语言
and
和or
返回操作数的值,而不是True
或False
。这不会改变条件中布尔表达式的含义-- 1 or True
为1
,但1
也为真。但它曾经被用来模拟条件运算符(C语法中的cond ? true_val : false_val
,Python语言中的true_val if cond else false_val
)。对于&
和|
,结果类型取决于操作数如何重载各自的特殊方法(True & False
是False
,99 & 7
是3
,对于集合则是联合/交集...)。这也适用于其他一些语言,如,Perl 但是,即使a_boolean & another_boolean
的工作方式相同,正确的解决方案也是使用and
--因为and
和or
与布尔表达式和条件相关联,而&
和|
则代表位翻转。
发布于 2014-09-20 22:07:03
这里还有一个更深层次的区别,这让我困惑了一段时间:因为&
(和其他按位运算符)比and
(和其他布尔运算符)具有更高的优先级,所以下面的表达式计算出不同的值:
0 < 1 & 0 < 2
对比
0 < 1 and 0 < 2
也就是说,第一个函数生成False
,因为它等同于0 < (1 & 0) < 2
,因此是0 < 0 < 2
,因此是0 < 0 and 0 < 2
。
https://stackoverflow.com/questions/3845018
复制相似问题