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
Run Code Online (Sandbox Code Playgroud)
输出 -
0
0
Run Code Online (Sandbox Code Playgroud)
总之,我的问题是为什么输出不是这样产生的?
0
1
Run Code Online (Sandbox Code Playgroud)
在第一次调用'first for循环'中的range()期间,调用是'range(len(list))',并且在第一次调用'second for循环'中的range()时,调用是'range(len(list))',相当于'first for循环'中第二次调用range().range()如何知道调用是来自'second for loop'而不是'first for loop'?
我不确定你为什么range 会记得它以前被调用过.该课程没有保留任何先前电话的状态; 它只是做你要求的.每次调用都会range(x)返回一个新range对象,该对象x-1在迭代时提供从0到0的数字.每个呼叫都独立于之前的呼叫.
要获得您描述的行为,您需要在每个循环中为对象重用相同的 迭代器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
Run Code Online (Sandbox Code Playgroud)
你可以形象像
for x in xs:
do_something(x)
Run Code Online (Sandbox Code Playgroud)
是的缩写
i = iter(xs)
while True:
try:
x = next(i)
except StopIteration:
break
do_something(x)
Run Code Online (Sandbox Code Playgroud)
iter实际上,如果它已经是迭代器,则返回它的参数,因此for当您尝试迭代非迭代器迭代时,每个循环都会返回一个新的,在开始时开始的迭代器.
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |