Python中"in"的优先级

ale*_*xis 24 python syntax operator-precedence

这是一个(非常基本的)语言律师问题.我理解代码的作用以及原因,所以请不要用基本的解释.

在表达式中,in具有更高的优先级and.所以,如果我写

if n in "seq1" and "something":
    ...
Run Code Online (Sandbox Code Playgroud)

它被解释就像

if (n in "seq1") and "something":
    ...
Run Code Online (Sandbox Code Playgroud)

然而,in一个的for循环具有的优先级低于and(其实它有,否则下面的是一个语法错误).因此,如果Python初学者写道

for n in "seq1" and "something":
    ...
Run Code Online (Sandbox Code Playgroud)

......,它相当于:

for n in ("seq1" and "something"):
    ...
Run Code Online (Sandbox Code Playgroud)

(如果"seq1"是真实的,则评估为for n in "something").

那么,问题是:in指定/记录for循环关键字的优先级在哪里?我理解这n in ...不是这个上下文中的表达式(它没有值),但它是for语句语法的一部分.不过,我不确定如何/在哪里指定非表达式优先级.

Ale*_*ley 29

for语句的上下文中,in它只是构成复合语句的语法的一部分,因此它与运算符不同in.Python语法规范定义了这样for语句:

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]
Run Code Online (Sandbox Code Playgroud)

要点是,此特定in内容不会被解释为target_list的一部分,因为比较操作(例如x in [x])不是有效目标.再次参考,语法规范target_list目标定义如下:

target_list     ::=  target ("," target)* [","]
target          ::=  identifier
                     | "(" target_list ")"
                     | "[" target_list "]"
                     | attributeref
                     | subscription
                     | slicing
                     | "*" target
Run Code Online (Sandbox Code Playgroud)

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

因此对于诸如for n in "seq1" and "something"明确的陈述.所述target_list部分是所述标识符n和所述expression_list部分是,可迭代"seq1" and "something"计算结果为.随着链接文档的继续说明,迭代中的每个项目依次分配给target_list.

  • @alexis:没有`"for"for target_list expression_list:`syntax,所以如果这样解释就会出现语法错误.而`in`是一个*binary*运算符,所以你需要一个左侧运算符.`target_list`不可能,因为没有`for expression_list:`语法. (4认同)

Mar*_*ers 18

这个词in在一for环是部分语句.声明没有优先权.

in另一方面,运算符总是成为表达式的一部分.优先级控制表达式中运算符之间的相对优先级.

然后在语句中,查找expression其文档语法中的部分.对于for语句,语法是:

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]
Run Code Online (Sandbox Code Playgroud)

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

然后在Python的语法规则中设置'order',它管理解析器.语句是顶级构造,请参阅顶级组件文档(将独立表达式称为表达式语句).表达式始终是语句的一部分,使语句优先于语句中包含的任何内容.