如何在python中解释这个循环结果?

时间:2011-09-19 12:33:13

标签: python loops

x=range(1,4)
y=range(1,4)


[(xi,yi) for xi in x for yi in y if xi is yi]
 #output
 # [(1, 1), (2, 2), (3, 3)]

[(xi,yi) for xi in x if xi is yi for yi in y ]
 #output, I am confused about this one
 #[(3, 1), (3, 2), (3, 3)]

任何人都可以解释为什么第二个循环会像这样结果吗?

我很担心多个内联循环在Python中是如何工作的。

此外,任何关于python内联循环的教程都是受欢迎的

2 个答案:

答案 0 :(得分:7)

第二个结构本身不是有效的代码:

In [1]: x=range(1,4)

In [2]: y=range(1,4)

In [3]: [(xi,yi) for xi in x if xi is yi for yi in y ]
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)

/home/aix/<ipython console> in <module>()

NameError: name 'yi' is not defined

yi中的xi is yi并不是指之后的yi。它指的是一个名为yi的预先存在的变量(至少是在第一次迭代期间发生的变量)。

代码为您工作的唯一原因是您以前运行过第一个构造,并且在全局名称空间中留下了yi(设置为3)。

答案 1 :(得分:0)

这就是重点,第二个循环在第一个循环之后运行,当我操作它时。

yi在本地范围内实际上是3。

如果单独运行它们,第二个将引发错误。