我试图找到答案,抱歉我似乎找不到答案。在以下代码中:
friends = ['Bob','Luke','Ian', 'Frank']
for friend in friends:
print (friend)
Python如何知道朋友是什么,它没有被定义,我们告诉python的是我们有一个名为friends的变量(在这种情况下是一个项目列表)。
在尝试向学生解释之前,我试图在脑海中解决这个问题。谢谢你的帮助
答案 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
。