"in" 在 Python 中的优先级
Precedence of "in" in Python
这是一个(非常基本的)语言律师类的问题。我了解代码的作用和原因,所以请不要进行基本解释。
在一个表达式中,in
比and
有higher 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_list和target是defined 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 部分是标识符 n
而 expression_list 部分是 [=24 的可迭代对象=] 评估为。正如链接文档继续说的那样,可迭代对象中的每个项目依次分配给 target_list。
这是一个(非常基本的)语言律师类的问题。我了解代码的作用和原因,所以请不要进行基本解释。
在一个表达式中,in
比and
有higher 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_list和target是defined 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 部分是标识符 n
而 expression_list 部分是 [=24 的可迭代对象=] 评估为。正如链接文档继续说的那样,可迭代对象中的每个项目依次分配给 target_list。