繁体   English   中英

Python遍历列表如何工作?

[英]Python loop through a list how does it work?

我试图找到一个答案,对不起,我似乎找不到一个答案。 在以下代码中:

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

Python如何知道朋友是什么(未定义),我们只告诉python我们有一个称为Friends的变量(在本例中为项目列表)。

在尝试向学生解释之前,我想尽办法。 谢谢你的帮助

for friend in friends:
    print(friend)

是的简写

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

这就是在Python中实现for语句的方式。 手册

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

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

因此, friend不是未定义的,它是由for语句定义的。

除了解释精细度的其他答案外,在每次迭代中python都将list中的元素分配给name来命名为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中定义,并由编译器和解释器使用。

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

for语法:

for element in iterable:
    pass

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM