这是一个(非常基本的)语言律师问题。我了解代码的作用以及原因,因此请不要进行基本解释。
在表达式中,in
比and
具有higher precedence。所以如果我写
if n in "seq1" and "something":
...
它的解释就像
if (n in "seq1") and "something":
...
但是,
in
循环的for
的优先级比and
低(实际上必须如此,否则以下语法错误)。因此,如果是Python初学者writesfor n in "seq1" and "something":
...
...,它等效于:
for n in ("seq1" and "something"):
...
(假设“seq1”是真实的,则求值为
for n in "something"
)。因此,问题是:for/loop的
in
关键字的优先级在哪里指定/记录?我知道n in ...
在这种情况下不是表达式(它没有值),而是for
语句语法的一部分。不过,我不确定如何/在何处指定非表达式优先级。 最佳答案
在for
语句的上下文中,in
只是构成该复合语句的语法的一部分,因此它不同于运算符in
。 Python语法规范定义了for
语句like this:
for_stmt ::= "for" target_list "in" expression_list ":" suite
["else" ":" suite]
需要说明的是,由于比较操作(例如
in
)不是有效的目标,因此该特定x in [x]
不会解释为target_list的一部分。再次引用语法规范,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部分是"seq1" and "something"
求值的可迭代项。如链接文档所述,可迭代对象中的每个项目都依次分配给target_list。关于python - Python中 “in”的优先级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33897137/