Python循环列表如何工作?

时间:2015-02-03 08:53:16

标签: python list

我试图找到答案,抱歉我似乎找不到答案。在以下代码中:

friends = ['Bob','Luke','Ian', 'Frank']
for friend in friends:
    print (friend)

Python如何知道朋友是什么,它没有被定义,我们告诉python的是我们有一个名为friends的变量(在这种情况下是一个项目列表)。

在尝试向学生解释之前,我试图在脑海中解决这个问题。谢谢你的帮助

4 个答案:

答案 0 :(得分:6)

for friend in friends:
    print(friend)

的简写
it = iter(friends)
while True:
    try:
        friend = next(it)
    except StopIteration:
        break
    print(friend)

答案 1 :(得分:4)

在Python中实现for语句的方式。来自manual

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]
  

表达式列表评估一次;它应该产生一个可迭代的对象。为expression_list的结果创建一个迭代器。然后,对于迭代器提供的每个项,按升序索引的顺序执行一次该套件。依次使用标准的分配规则将每个项目分配给目标列表,然后执行该套件。

因此friend未定义,而for语句定义了{{1}}。

答案 2 :(得分:3)

除了解释精确性的其他答案,以及python在每次迭代中将列表中的元素分配给名称friend的事实,您可以使用dis模块详细查看:

>>> def fun():
    ...    friends = ['Bob','Luke','Ian', 'Frank']
    ...    for friend in friends:
    ...       print friend
    ... 
>>> import dis
>>> dis.dis(fun)
  2           0 LOAD_CONST               1 ('Bob')
              3 LOAD_CONST               2 ('Luke')
              6 LOAD_CONST               3 ('Ian')
              9 LOAD_CONST               4 ('Frank')
             12 BUILD_LIST               4
             15 STORE_FAST               0 (friends)

  3          18 SETUP_LOOP              19 (to 40)
             21 LOAD_FAST                0 (friends)
             24 GET_ITER            
        >>   25 FOR_ITER                11 (to 39)
             28 STORE_FAST               1 (friend)

  4          31 LOAD_FAST                1 (friend)
             34 PRINT_ITEM          
             35 PRINT_NEWLINE       
             36 JUMP_ABSOLUTE           25
        >>   39 POP_BLOCK           
        >>   40 LOAD_CONST               0 (None)
             43 RETURN_VALUE 

正如您在下面一行中看到的那样,python开始分配friend,并在每次迭代后再次分配:

15 STORE_FAST               0 (friends) 
  

dis模块支持通过反汇编分析CPython字节码。该模块作为输入的CPython字节码在文件Include / opcode.h中定义,并由编译器和解释器使用

答案 3 :(得分:0)

friend绑定在for语句中。在循环的每次迭代中,iterable的下一个元素都绑定到它。在您的情况下,可迭代为friends

for语法:

for element in iterable:
    pass

遍历iterable,将每个元素绑定到element