2012-11-08 44 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

这是无关的变量。 您正在使用枚举器对象,并在第一个循环中结束。 您必须重新创建第二个循环。