'range()'如何在内部工作?

时间:2016-10-08 17:05:25

标签: python range

在这种情况下,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'?

1 个答案:

答案 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。