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)
因此语法确保解析器in在target_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.
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',它管理解析器.语句是顶级构造,请参阅顶级组件文档(将独立表达式称为表达式语句).表达式始终是语句的一部分,使语句优先于语句中包含的任何内容.