[英]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.