我遇到了一段代码:
queue = [(Xi, Xk) for Xi in csp.vars for Xk in csp.neighbors[Xi]]
这相当于:
for Xi in csp.vars:
for Xk in csp.neighbors[Xi]:
queue.append((Xi, Xk))
或者这是否表示除了嵌套语句之外的其他内容?
答案 0 :(得分:4)
你完全正确。请参阅list comprehension documentation:
提供列表推导时,它包含一个表达式,后跟至少一个
for
子句和零个或多个for
或if
子句。在这种情况下,新列表的元素是通过将每个for
或if
子句视为一个块,从左到右嵌套,并评估表达式以生成列表而生成的元素。每次到达最里面的块时都会元素。
所以你对for循环嵌套的解释就是现实。
答案 1 :(得分:2)
正如其他人已经指出的那样,这正是它的含义。
我也发现在list-comprehension / genexp中使用multiple有时会让人感到困惑,所以我通常会避免使用它们。当我使用它们时,我通常将每个用于不同的行,例如:
queue = [(Xi, Xk) for Xi in csp.vars
for Xk in csp.neighbors[Xi]]
甚至是缩进:
queue = [(Xi, Xk) for Xi in csp.vars
for Xk in csp.neighbors[Xi]]
这清楚表明哪个是内部for循环。
此外,list-comprehension可以为每个for循环都有一个if表达式,所以完整的语法类似于:
queue = [(Xi, Xk) for Xi in csp.vars
if condition_one()
for Xk in csp.neighbors[Xi]
if condition_two()
... ]
即使我希望你永远不会写那样的东西。最后的if表达式很好,但是将它与for混合使得太麻烦而且根本不可读。