3
True and "asdf" or "qwer"

结果=>“asdf”

False and "asdf" or "qwer"

结果=>“qwer”

我无法理解这些东西是如何工作的。我认为字符串上的布尔运算符会产生类型错误,但事实并非如此。是不是类似于预定义的语句,例如“a if b else c”?

4

6 回答 6

5

确定答案后, Python操作停止并返回最后扫描的对象的值。他们不返回TrueFalse。我喜欢这个功能,并且发现自己一直在使用它。

由于非空字符串计为 True

True and "asdf" or absolutely_anything_here_or_following

当它遇到or时停止计算,因为现在确定了答案(or值之一为真),并返回它检查的最后一件事(“asdf”)。甚至没有进一步的操作数被检查。

另一方面,当

False and "asdf" or absolutely_anything_here

点击or,它还不知道 anwser 所以继续下一个操作数。只要 absolute_anything_here 是最后一个操作,就确定答案并返回最后扫描的东西。

于 2013-06-03T04:16:03.647 回答
3

and并且or就像熟悉的布尔运算符一样工作 - 如果它们的两个操作数都为真,则它们分别返回真,如果它们的操作数之一为真,它们分别返回真。

它们也会短路,就像&&和一样||

然而,在 Python 中,任何东西都可以被解释为布尔上下文TrueFalse在布尔上下文中,还有一个额外的事实——当它有足够的信息来停止评估时,它将返回在布尔上下文中评估True或评估的第一个操作数。False(这与构造和返回一个真正的布尔值True或是相反的False。)这样做是可以的,因为如果它是布尔值,它将评估为如果不是这个事实,它将返回的布尔值。

因此(请注意,在布尔上下文""中评估为):False

>>> "" and "a"
''
>>> "a" and "b"
'b'
>>> "a" and ""
''
>>>


>>> "" or ""
''
>>> "a" or ""
'a'
>>> "" or "a"
'a'
>>> "a" or "b"
'a'

>>> "" or False
False
>>> "" or True
True

>>> False and ""
False
于 2013-06-03T03:50:01.167 回答
2

在 Python 条件运算符之前:

>>> age=20
>>> 'legal' if age>=21 else 'not legal'
'not legal'

曾经有“货物代码”作为基于索引元组的解决方法:

>>> ('not legal','legal')[age>=21]
'not legal'
>>> age=22
>>> ('not legal','legal')[age>=21]
'legal'

您可以拆解您发布的两个替代方案,以查看引擎盖下发生了什么:

>>> import dis
>>> def f():
...    x=True and "asdf" or "qwer"
...    y=False and "asdf" or "qwer"
... 
>>> dis.dis(f)
  2           0 LOAD_GLOBAL              0 (True)
              3 POP_JUMP_IF_FALSE       12
              6 LOAD_CONST               1 ('asdf')
              9 JUMP_IF_TRUE_OR_POP     15
        >>   12 LOAD_CONST               2 ('qwer')
        >>   15 STORE_FAST               0 (x)

  3          18 LOAD_GLOBAL              1 (False)
             21 POP_JUMP_IF_FALSE       30
             24 LOAD_CONST               1 ('asdf')
             27 JUMP_IF_TRUE_OR_POP     33
        >>   30 LOAD_CONST               2 ('qwer')
        >>   33 STORE_FAST               1 (y)
             36 LOAD_CONST               0 (None)
             39 RETURN_VALUE 

您可以看到您看到的值弹出到您看到的值。您还可以查看布尔运算符的短路行为,并查看这是记录在案的行为。

于 2013-06-03T04:18:14.537 回答
0

python中的对象被认为是真假(如,'',无)

布尔结果的结果取决于可以确定结果的最后一个值。

打印 'aa' 和 True

真的

'aa' 为 True,但不能确定结果,所以结果转为 True

尽管

print True and 'aa'

'啊'

但是运算符 or 与运算符 and 不同,请参见

print None and True

没有任何

第一个 None 被认为是 False,它可以确定最后一个结果,所以它打印 'None'

尽管

print False or 'bb'

'bb'

因为第一个 False 不能确定最终结果!

于 2013-06-03T04:00:41.823 回答
0

第一个示例
Python 从左到右扫描和评估。

在你的第一个例子中

True and "asdf" or "qwer"

评估为

"asdf" or "qwer"

因为非空字符串为 True,Python 会短路(忽略第二个操作数)并返回第一个操作数"asdf"。请记住,无论 的值如何,True or x都会返回。Truex

第二个例子

False and "asdf" or "qwer"

这评估为

False or "qwer"

这次我们没有在第一个操作数上短路(我们还没有足够的信息),Python 需要检查第二个操作数qwer,它True在布尔上下文中计算为 (记住它不是空的),并返回它。

于 2013-06-03T04:25:09.950 回答
0

运算符的操作顺序: --not 首先评估;-- 并且接下来被评估;--or 最后评估。根据您的问题,首先评估“and”运算符,因为非空字符串计为 True。因此 True 和 "asdf" 变为 True 而不是 True 或 "qwer" 也变为 true。SO 结果变为“asdf”在第二个 False 中,“asdf”变为假和假,“qwer”变为假。因此它是假的,所以它返回检查“qwer”的最后一件事。

于 2018-04-07T10:08:53.730 回答