''和'逻辑运算符和“&”之间有什么区别在这种情况下,Python的按位运算符?

时间:2014-10-05 03:26:26

标签: python bitwise-operators logical-operators

我在Python中有2个案例: 1)案例1:

print "AND :", exists("") and os.path.getsize("")

此案例将给出结果:AND : False

2)案例2:

print "Bitwise :", exists("") & os.path.getsize("")

此案例将产生如下错误:

Bitwise :
Traceback (most recent call last):
  File "G:\Dropbox\Workspace_Python\PyGUI\default\__init__.py", line 6, in <module>
    print "Bitwise :", exists("") & os.path.getsize("")
  File "C:\Python27\lib\genericpath.py", line 49, in getsize
    return os.stat(filename).st_size
WindowsError: [Error 3] The system cannot find the path specified: ''

你能帮我解释一下这两种情况之间的区别吗?

2 个答案:

答案 0 :(得分:4)

逻辑and运算符中,如果第一个表达式为falsey,则不会计算第二个表达式。由于exists("")失败,os.path.getsize("")永远不会在第一种情况下执行。

但是在按位&运算符的情况下,两个操作数都必须进行评估才能得到结果。由于你不能stat无效的文件(为了获得大小),它会因错误而失败。

引用Boolean operations文档,

  

表达式x and y首先评估x;如果x为false,则返回其值;否则,将评估y并返回结果值。

另请注意,

  

在布尔运算的上下文中,以及控制流语句使用表达式时,以下值被解释为false:FalseNone,所有类型的数字零和空字符串和容器(包括字符串,元组,列表,字典,集合和frozensets)。所有其他值都被解释为true。

所以,当你评估时

exists("") and os.path.getsize("")

exists("")返回False,根据上述引文,它会立即返回False,而不必执行os.path.getsize("")

答案 1 :(得分:0)

与大多数语言一样,逻辑 ANDs将"short-circuit"并在第一个参数为false时立即中止(因为无论第二个参数如何,结果都相同)。

在您的示例中,如果您将二进制AND(and)翻转为OR(or),则语言不会短路,因为第一个结果为false并且需要检查第二,看它是否应该在整体上返回真或假。