4

如果我有以下情况:

if a(my_var) and b(my_var):
    do something

我可以假设只有在isb()时才评估?还是可以先做?a()Trueb()

询问是因为在is时评估b()会导致异常。a()False

4

4 回答 4

7

b()a(my_var)仅在is时才会被评估True,是的。如果是假的,and则运算符短路a(my_var)

布尔运算符文档中:

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

您可以使用在调用时打印某些内容的函数自己进行测试:

>>> def noisy(retval):
...     print "Called, returning {!r}".format(retval)
...     return retval
... 
>>> noisy(True) and noisy('whatever')
Called, returning True
Called, returning 'whatever'
'whatever'
>>> noisy(False) and noisy('whatever')
Called, returning False
False

Python 将空容器和数字 0 值视为 false:

>>> noisy(0) and noisy('whatever')
Called, returning 0
0
>>> noisy('') and noisy('whatever')
Called, returning ''
''
>>> noisy({}) and noisy('whatever')
Called, returning {}
{}

自定义类可以实现一个__nonzero__钩子来为同一测试返回一个布尔标志,或者如果它们是容器类型,则实现一个__len__钩子;返回0意味着容器是空的,被认为是假的。

在一个密切相关的注释中,or操作员做同样的事情,但相反。如果第一个表达式的计算结果为 true,则不会计算第二个表达式:

>>> noisy('Non-empty string is true') or noisy('whatever')
Called, returning 'Non-empty string is true'
'Non-empty string is true'
>>> noisy('') or noisy('But an empty string is false')
Called, returning ''
Called, returning 'But an empty string is false'
'But an empty string is false'
于 2013-06-21T09:35:42.860 回答
1

是的,这样做是安全的。如果条件被延迟评估,则为 Python。

于 2013-06-21T09:35:48.023 回答
1

help()(哈哈)的帮助下:

>>> help('and')

Boolean operations
******************

   or_test  ::= and_test | or_test "or" and_test
   and_test ::= not_test | and_test "and" not_test
   not_test ::= comparison | "not" not_test

...

The expression ``x and y`` first evaluates *x*; if *x* is false, its
value is returned; otherwise, *y* is evaluated and the resulting value
is returned.

...

所以是的,如果a(my_var)返回 False,则b不会调用该函数。

于 2013-06-21T09:41:11.297 回答
0

编译器总是从上到下从左到右读取。因此If False and True,编译器首先遇到 False 并退出 if 条件。这对我知道的所有软件都有效。

于 2013-06-21T09:39:32.493 回答