2014-09-12 86 views
3

基本for循环,我需要帮助了解如何循环的话:Python的一个字字'循环

word = "hello" 
for word in word: 
    print word 

岂不word=hello变量与word=h覆盖只要for循环开始了吗? 如果是这样,它是如何遍历字串中的所有字母?

在此先感谢您的澄清。

回答

12

让我们看字节码:

>>> def so25807731(): 
... word = "hello" 
... for word in word: 
...  print word 
... 
>>> import dis 
>>> dis.dis(so25807731) 
    2   0 LOAD_CONST    1 ('hello') 
       3 STORE_FAST    0 (word) 

    3   6 SETUP_LOOP    19 (to 28) 
       9 LOAD_FAST    0 (word) 
      12 GET_ITER    
     >> 13 FOR_ITER    11 (to 27) 
      16 STORE_FAST    0 (word) 

    4   19 LOAD_FAST    0 (word) 
      22 PRINT_ITEM   
      23 PRINT_NEWLINE  
      24 JUMP_ABSOLUTE   13 
     >> 27 POP_BLOCK   
     >> 28 LOAD_CONST    0 (None) 
      31 RETURN_VALUE   

注意如何第一,巨蟒抓住的字符串迭代器(GET_ITER )并循环遍历,而不是实际的字符串(FOR_ITER)。

因此,它不需要原始字符串来“记住”字符是什么;它只是使用新创建的迭代器。 “旧word”值已不再使用,因此您可以毫无问题地覆盖它。同样的逻辑也解释了为什么这个代码可以作为很好:

word = "llamas" 
for character in word: 
    word = None 
    print character 
+0

http://www.shutupandship.com/2012/01/understanding-python-iterables-and.html这也是一个很好的消除它如何工作:) – gkocjan 2014-09-12 12:01:49

+0

值得指出的是,因为'for'循环不会创建一个新的作用域,名称'word'在循环完成后不再引用字符串'“hello”',而是字符串'“o”'。 – chepner 2014-09-12 12:07:35

+0

完美,我有一个轻微的怀疑这是它的工作原理,但这真的帮助我理解它!非常感谢你:) – Djfluffwug 2014-09-12 12:14:31

-3

我从来没有编码的蟒蛇,但我客串它会像这样工作

word = "hello" 
i=0 
while i <len(word): 
    print word[i] 
    i += 1 
+0

更新增量我 – 2014-09-12 11:59:21

+0

可以看到,你从来没有编码的Python。这是一堆反模式。 – Matthias 2014-09-12 12:01:02

+1

但它不回答问题。问题是为什么它打印整个单词,而不仅仅是第一个字母。 – gkocjan 2014-09-12 12:03:03