当前位置: 首页 > 知识库问答 >
问题:

为什么' not(True) * True '不会给我一个无效的语法错误,就像' True * not(True)'一样?

茹轩昂
2023-03-14

这是Python中运算符层次顺序的结果吗?

not(True)* True
#False
True* not(True)
#SyntaxError: invalid syntax

共有2个答案

艾灿
2023-03-14

Anthony Sotille的回答说,Python试图解析*不是作为“不是”或“不在”运算符,但解析器或语法中没有任何东西可以尝试这样做。这实际上是一个优先级问题,以及如何实现优先级。

< code>*比< code>not具有更高的优先级,Python语法中的工作方式是存在表达式类型的层次结构,其结构使得优先级较高的运算符可以是优先级较低的运算符的参数的“根”运算符,而不是相反。

term[expr_ty]:
    | a=term '*' b=factor { _PyAST_BinOp(a, Mult, b, EXTRA) }
    | a=term '/' b=factor { _PyAST_BinOp(a, Div, b, EXTRA) }
    | a=term '//' b=factor { _PyAST_BinOp(a, FloorDiv, b, EXTRA) }
    | a=term '%' b=factor { _PyAST_BinOp(a, Mod, b, EXTRA) }
    | a=term '@' b=factor { CHECK_VERSION(expr_ty, 5, "The '@' operator is", _PyAST_BinOp(a, MatMult, b, EXTRA)) }
    | factor

term 是乘法表达式的语法规则。此规则中的前 5 个选项由中间的乘法优先运算符、运算符左侧的另一个和右侧的因子组成,其中因子是下一个优先级较高的运算符类的规则。第6个选项只是一个因素

这样构造语法可以确保解析的语法树始终与运算符优先级给出的结构相匹配,但这也意味着低优先级运算符不能成为高优先级运算符的参数的“根”运算符,即使表达式看起来是明确的。只是没有语法规则允许not表达式作为*表达式的参数。

(大多数表达式的语法规则遵循上述结构,但也有例外。例如,括号的语法规则不遵循“在高优先级表达式中没有低优先级运算符”结构,这就是为什么您可以编写类似 3 * (4 5) 的内容。幂是另一个例外 - ** 比左侧的一元 /-/~ 绑定更紧密,但右侧没有,因此 ** 和一元 /-/~ 的规则不遵循明确的优先级层次结构。

戚繁
2023-03-14

这是Python中运算符层次顺序的结果吗?

是的(尽管通常的术语是运算符优先级)。总结和简化:

> < li>

not不是函数;它是一个操作员。因此,我们不需要为< code>not (True)写括号,实际上它们在这里什么也不做。所有发生的事情是,括号被视为普通的分组括号- (True)在任何事情之前被计算,成为< code>True。所以,让我们考虑没有括号的例子。

不真 * 真表示不 (真 * 真)。这并不意味着(不是 True) * True,由于运算符优先。这是设计使然:

>>> not 1 * 0
True
>>> not (1 * 0)
True
>>> (not 1) * 0
0

由于相同的运算符优先级,True * 而不是 True 是语法错误。Python 将 not 本身解析为 * 的右侧,因为它还没有机会应用 not True真*不是显然是无稽之谈。或者,另一种看待它的方式:“跟一个表达式”不在“可以成为*的操作数的事物”列表中。

这可能令人惊讶,因为另一个常用的一元运算符< code>-(即一元否定)没有这个问题。但这是因为优先级正好相反:一元否定在乘法之前处理,而不是在乘法之后。

对于 and 和 组合也是如此:

>>> 3 * 5 and 1 # 3 * 5 is evaluated first
1
>>> 3 * (5 and 1)
3
>>> 3 or 1 * 5 # 1 * 5 is evaluated first, even though it comes later
3
>>> (3 or 1) * 5
15
 类似资料:
  • 问题内容: 如果我这样做: 那又回来了。仅仅是因为在列表中。 但是,如果我这样做: 那又回来了。而等于: 为什么? 问题答案: 运算符优先级 2.x,3.x。的优先级低于的优先级。因此,它等效于: 这就是你想要的: 正如@Ben指出的那样:建议从不写作,更喜欢。前者使它看起来像一个函数调用,而它却是一个运算符,而不是一个函数。

  • 问题内容: 将布尔值与Python中的作品进行比较。但是,当我应用布尔运算符时,结果是语法错误: 为什么这是语法错误?我希望它是一个返回布尔值的表达式,并且只要是具有有效语法的表达式,它都是有效语法。 问题答案: 它与Python中的运算符优先级有关(解释器认为您正在比较True与Not,因为它的优先级高于)。您需要一些括号来阐明操作顺序: 通常,不能在没有括号的比较右侧使用。但是,我想不出您需要

  • 输出为“假”,但为什么?我将<code>truetruevs什么时候合适? 编辑:一些用户提到我应该看到错误,但我没有。我在PowerShell 2.0(Windows 7)和PowerShell 4.0(Windows 8.1)中都尝试过。和确实像我说的那样更改了COM属性。 编辑:事实证明,我们将< code>true赋给了COM属性,但它们实际上收到了false。我们的路径中有gnuwin3

  • 为什么mysql中IS TRUE和=True的结果不一样? 我有一张user表,结构如下: 表中数据如下: 我尝试查询sql: 结果为: 查询sql: 结果为: 我用true或者false作为查询条件是因为:在java中tinyint能被转成Boolean,所以在查询的时候能直接传true或者false 有没有大佬知道为什么结果不一样呢?

  • 问题内容: 我的交互式控制台的简要记录: 到底为什么呢? 编辑: 为了对比起见,请考虑运算符。 这使得有很大的意义,因为虽然和都意味着同样的事,作为一个条件语句,他们真的是不一样的东西。 再次编辑: 更有趣的后果: 问题答案: 因为Python中的Boolean是整数的子类型。从文档中: 布尔值是两个常量对象False和True。它们用于表示真值(尽管其他值也可以视为假或真)。在数字上下文中(例如

  • 请看一下这里;谢谢大家!我试图在游戏中创建一个升级建筑的系统。我让我的升级分区对所有建筑都一样。当玩家点击build(div)时,运行一个函数以显示一个隐藏div,该div由ajax post填充,包含升级成本。div的类“name”(与db中的building name相同)被发送到php以获取所需的数据。直到现在它还可以正常工作。。。我在一个按钮中添加了一个click事件,该按钮应将div“n