2012-11-08 100 views
2

我對python中變量的作用域感到困惑。這裏是什麼,我試圖做一個玩具的例子:for/if循環和python變量的作用域

a = True 
enumerated_set = enumerate(['tic','tac','toe']) 
for i,j in enumerated_set: 
    if a == True: 
     print j 

結果我得到的是:

tic 
tac 
toe 
現在

print a

回報

`True` 

如果我再跑一次

for i,j in enumerated_set: 
    if a == True: 
     print j 

我沒有輸出。

我很困惑...因爲全球範圍內a = True,爲什麼在第二個循環中打印沒有執行。

我感謝您的幫助。

編輯:在這裏我很困惑

y = 'I like this weather'.split() 
for item in y: 
    for i,j in enumerated_set: 
     if a == True: 
      print j 

也不會產生輸出另一個例子....

+1

您每次需要使用時都需要重新創建由'enumerate'創建的生成器。 –

回答

7

它實際上是不是與你的布爾問題。那總是True

enumerated_set是一個發生器。一旦你通過它,它已經耗盡。您需要創建一個新的。

In [9]: enumerated_set = enumerate(['tic','tac','toe']) 

In [10]: enumerated_set.next() 
Out[10]: (0, 'tic') 

In [11]: enumerated_set.next() 
Out[11]: (1, 'tac') 

In [12]: enumerated_set.next() 
Out[12]: (2, 'toe') 

In [13]: enumerated_set.next() 
--------------------------------------------------------------------------- 
StopIteration        Traceback (most recent call last) 
/usr/local/<ipython-input-13-7b0a413e4250> in <module>() 
----> 1 enumerated_set.next() 

StopIteration: 
+0

哦,現在有道理。我剛剛閱讀了python文檔,沒有提到它是詳盡的。謝謝! – notrockstar

+1

@notorckstart:不要忘記接受答案;-)他回答更快,然後我可以評論! ;-) –

+0

它必須耗盡,否則當你循環時永不停止:-)沒問題!我認爲你正在考慮將它當作一個函數調用,比如當你遍歷一個列表時,它會調用每次循環索引的內建方法。這更像是一個「保存」循環,只有每次你問它時才進行評估。 – jdi

1

這是不是由於範圍,這是由於enumerate的性質,這將創建一個發電機,而不是一個列表。生成器是一次性的:它們依次彈出元素,它們不創建可以再次評估的列表。這節省了內存。

如果你想遍歷enumerated_set兩次,你可以這樣做:

enumerated_set = list(enumerate(['tic','tac','toe']))

1

這是無關的變量。 您正在使用枚舉器對象,並在第一個循環中結束。 您必須重新創建第二個循環。