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

在表达式中,inand具有higher precedence。所以如果我写

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

它的解释就像
if (n in "seq1") and "something":
    ...

但是,in循环的for的优先级比and低(实际上必须如此,否则以下语法错误)。因此,如果是Python初学者writes
for 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/

10-16 20:31