2011-09-19 23 views
1
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中多個內聯循環是如何工作感到困惑。

另外,在線路迴路是有利的有關python任何教程

+3

當你達到複雜程度時,我可能不會使用列表comp。常規循環可能更具可讀性。另外,你不應該像這樣使用'is'。 'is'檢查對象是否相等,而不是值相等。 – Daenyth

+0

這是一個很好的觀點。 – xiaohan2012

+1

請勿使用'is'來比較數字。使用'=='。 –

回答

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 

xi is yiyi是不是指所述yi那是在那之後。它指的是一個名爲yi的預先存在的變量(至少在第一次迭代期間會發生這種情況)。

代碼爲您工作的唯一原因是您之前運行了第一個構造,並且在全局命名空間中留下了yi(設置爲3)。

0

這是關鍵,第二個循環在第一個循環之後運行,當我操作它時。

yi實際上是3在本地範圍內。

如果單獨運行它們,第二個將會引發錯誤。