在这种情况下,range()如何区分正在进行的调用?
示例:
def ex():
list = [1,2,3,4]
for val in range(len(list)):
print(val)
break
for val in range(len(list)):
print(val)
break
输出
0
0
简而言之,我的问题是为什么输出不会这样产生?
0
1
在第一次调用'first for循环'中的range()期间,调用是'range(len(list))', 并且在第一次调用'second for循环'中的range()时,调用是'range(len(list))',它相当于'first for循环'中第二次调用range()。 range()如何知道调用是来自'second for loop'而不是'first for loop'?
答案 0 :(得分:6)
我不确定您为什么期望range
会记住它之前已被调用过。该课程没有保留任何先前电话的状态;它只是做你要求的。每次调用range(x)
都会返回一个新的range
对象,当您迭代它时,它会提供从0到x-1
的数字。每次通话都与之前的任何通话无关。
要获得您描述的行为,您需要在每个循环中为range
对象重用相同的 迭代器。
Python 3.5.1 (default, Apr 18 2016, 11:46:32)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> l = [1,2,3,4]
>>> r = range(len(l))
>>> for val in r:
... print(val)
... break
...
0
>>> for val in r:
... print(val)
... break
...
0
>>> i = iter(r)
>>> for val in i:
... print(val)
... break
...
0
>>> for val in i:
... print(val)
... break
...
1
你可以想象像
这样的东西for x in xs:
do_something(x)
是
的缩写i = iter(xs)
while True:
try:
x = next(i)
except StopIteration:
break
do_something(x)
iter
返回它的参数,如果它实际上已经是一个迭代器,那么当你试图迭代一个非for
循环时,每个$('#dad-board > dad-cell')
循环都会返回一个新的,起始开始的迭代器-iterator iterable。