Python,括号对print语句中布尔值的影响

Muh*_*sta 3 python python-2.7 python-3.x

你能告诉我为什么括号会影响传递给print语句的布尔值的输出吗?

例:

print(True and False) or (True or False)
#         False       or      True
# Python 2.7 >>> True
# Python 3.6 >>> False
Run Code Online (Sandbox Code Playgroud)

但是当我使用括号时:

print((True and False) or (True or False))
#          False       or      True
# Python 2.7 >>> True
# Python 3.6 >>> True
Run Code Online (Sandbox Code Playgroud)

Python 3中的解释器是否只看到第一部分(第一个括号内的部分)?如果是这样,为什么它不会为该行的其余部分抛出错误?

其他例子:

print(True and True) and (True and False)
#          True      and      False
# Python 2.7 >>> False
# Python 3.6 >>> True

print((True and True) and (True and False))
#          True       and      False
# Python 2.7 >>> False
# Python 3.6 >>> False

print(True and True) and not (False or True)
#         True       and not       True
# Python 2.7 >>> False
# Python 3.6 >>> True

print((True and True) and not (False or True))
#         True        and not       True
# Python 2.7 >>> False
# Python 3.6 >>> False

print(False or True) and not (True and True)
#          True      and not       True
# Python 2.7 >>> False
# Python 3.6 >>> True

print((False or True) and not (True and True))
#          True       and not       True
# Python 2.7 >>> False
# Python 3.6 >>> False
Run Code Online (Sandbox Code Playgroud)

答案更新和评论:

我在BOLD的问题:

在Python3中,print是一个函数. print(True and False)None,和

print(True and False) or (True or False)

是相同的

None and (True or False)

其是False,因为没有一个是假-γ在布尔上下文.

是不是要告诉口译员打印某些东西或评估其他东西?这怎么可能是一个有效的语法?

因为第一部分被评估None 然后第二次评估: None and (True or False) 除非我在shell中运行它,否则不应该打印任何东西. 例如:None and (True or False)如果运行在像SublimeText3这样的代码编辑器中运行,则运行不会将结果打印给用户(我没有在sublime中使用任何额外的插件或包,只有程序的构建函数,并且它不会打印任何东西除非它被传递给印刷声明.)

小gif演示

Thi*_*lle 8

在Python3中,print是一个函数.作为没有特定返回值的所有函数,它返回None.

那么,执行时会发生print(True and False) or (True or False)以下情况:

True and False得到评估,给出False.

print()使用Falseas参数调用该函数.此print(False)第一打印"假"到终端,然后返回该值None.

现在,

None or (True or False)
Run Code Online (Sandbox Code Playgroud)

得到评估为真.

如果您将此作为脚本的一部分执行,则会打印"False",整个​​表达式将被评估为True,并且由于您没有将其分配True给任何内容,因此它将被丢弃.

如果在REPL中执行此操作,则会打印"False",整个​​表达式将被计算到False,并且REPL会打印评估结果,因为如果您输入了2 + 2,它将打印4,因此您将获得

>>> print(True and False) or (True or False)
False  # <-- from print
True  # <-- from the REPL, result of the evaluation of the whole expression
Run Code Online (Sandbox Code Playgroud)

如果执行会有一点不同print(True and False) and (True or False).这次,在打印之后,表达式是

None and (True or False)
Run Code Online (Sandbox Code Playgroud)

None布尔上下文中的and假法一样,Python知道结果将是假的(甚至不需要评估(True or False)部分),并返回None,因为它是第一个允许它决定表达式的真实性的值.

如果你像以前一样将它作为脚本的一部分执行,则会打印"False",对整个表达式进行求值None,并且由于你没有将None它赋给任何东西,它就会被丢弃.

如果在REPL中执行此操作,则会打印"False",整个​​表达式将被计算为None.由于这是所有不返回任何函数的普通返回值,因此REPL不会打印它,除非您明确要求它:

>>> print(True and False) and (True or False)
False  # <-- from print, None doesn't get printed
>>> print(print(True and False) and (True or False))
False  # <-- from the inner print
None   # <-- None gets printed by the outer print 
>>> 
Run Code Online (Sandbox Code Playgroud)