"in" 在 Python 中的优先级

Precedence of "in" in Python

这是一个(非常基本的)语言律师类的问题。我了解代码的作用和原因,所以请不要进行基本解释。

在一个表达式中,inandhigher precedence。所以如果我写

if n in "seq1" and "something":
    ...

它的解释就像

if (n in "seq1") and "something":
    ...

然而,for 循环的 in 的优先级低于 and (事实上它必须如此,否则以下将是语法错误)。因此,如果 Python 初学者

for n in "seq1" and "something":
    ...

...,相当于:

for n in ("seq1" and "something"):
    ...

(假设 "seq1" 为真,计算结果为 for n in "something")。

所以,问题是:for 循环的 in 关键字 specified/documented 的优先级在哪里?我知道 n in ... 在此上下文中不是表达式(它没有值),而是 for 语句语法的一部分。不过,我不确定是否指定了 how/where 非表达式优先级。

for 循环中的单词 in 语句 的一部分。语句没有优先级。

另一方面,

in 运算符始终是表达式的一部分。优先级控制表达式中运算符之间的相对优先级。

然后在语句中,在其记录的语法中查找 expression 部分。对于for statement,语法是:

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]

您示例中的 and 运算符是 expression_list 部分的一部分,但 "in" 部分 不是表达式的一部分 .

'order' 然后在 Python 的语法规则中设置,它管理解析器。语句是顶级构造,请参阅 Top-level components documentation (with stand-alone expressions being called expression statements)。表达式始终是语句的一部分,使语句优先于语句中包含的任何内容。

for 语句的上下文中,in 只是组成该复合语句的语法的一部分,因此它不同于运算符 in。 Python 语法规范定义了一个 for 语句 like this:

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]

要指出的是,这个特定的 in 不会被解释为 target_list 的一部分,因为比较操作(例如 x in [x]) 不是有效的 目标 。再次参考语法规范,target_listtargetdefined as follows:

target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" target_list ")"
                     | "[" target_list "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target

因此语法确保解析器在 target_list 之后看到第一个 in 标记作为 for ... in ... 语句的一部分,并且不是二元运算符。这就是为什么尝试编写像 for (x in [x]) in range(5): 这样非常奇怪的东西会引发语法错误的原因:Python 的语法不允许像 (x in [x]) 这样的比较成为目标。

因此对于像for n in "seq1" and "something"这样的语句是没有歧义的。 target_list 部分是标识符 nexpression_list 部分是 [=24 的可迭代对象=] 评估为。正如链接文档继续说的那样,可迭代对象中的每个项目依次分配给 target_list