2013-08-22 42 views
2

Python文档中的shifting operationsbinary bitwise operations表示参数必须是整数,但下面的表达式没有错误地计算,但给出了<<>>的奇数结果。移位和二进制按位运算符适用于布尔参数

是否有一个额外的地方,我应该寻找文件&等使用布尔参数,或有一些很好的解释评估和结果?

  • 真&假:假(类 '布尔')
  • 真|假:真(类 '布尔')
  • 真^题:真(类 '布尔')
  • 〜真:-2(类 '诠释')
  • 〜错误:1(类 '诠释' )
  • 真< <真:2(类 'INT')
  • 假>>题:0(类 'INT')

代码:

# Python ver. 3.3.2 

def tryout(s): 
    print(s + ':', eval(s), type(eval(s))) 

tryout('True & False') 
tryout('True | False') 
tryout('True^False') 
tryout('~ True') 
tryout('~ False') 
tryout('True << True') 
tryout('False >> False') 

回答

5

boolint的子类,因此它们是整数。具体而言,True的行为与1相似,而False的行为与0的行为相同。

注意bool重新实现&|^(源:在蟒源Objects/boolobject.c源代码),对于所有其它操作所用的int方法[实际上是:继承],因此,结果是并且语义是整数的那些。

关于<<>>,表达True << True相当于1 << 11 * 2 == 2,而False >> False0 >> 0,即0 * 1 == 0

在对它们进行算术运算时,您应该认为python的TrueFalse10&,|^只有affect the return type的重新实现,而不是语义。

+0

很好的答案,很好的具体链接,谢谢。 –

+0

一个可能不应该对'bool'值进行算术运算。将“bool”作为“int”的子类作为实现细节处理,而不是“bool”作为“int”的语义断言。请参阅http://stackoverflow.com/q/8169001/1126841。 – chepner

+0

@chepner有时它可以被* sum *(可以迭代的元素设置为元素中的元素)而不是更长的sum(如果set中的元素可迭代的元素为1)'可以接受。 – Bakuriu