这个代码是做什么的?我说的主要是i
和framenum
:
for i, framenum in enumerate(range(start, end + 1)):
s.append(self.getSkeleton(framenum))
d[i] = self.getDepth(framenum)
u[i] = to_grayscale(self.getUser(framenum))
g[i] = to_grayscale(self.getRGB(framenum))
我能说每一次
i
的改变都会framenum
改变range(start, end + 1)
次吗?这相当于:
for i in enumerate(range(start, end + 1)):
for framenum in enumerate(range(start, end + 1)):
s.append(self.getSkeleton(framenum))
d[i] = self.getDepth(framenum)
u[i] = to_grayscale(self.getUser(framenum))
g[i] = to_grayscale(self.getRGB(framenum))
最佳答案
不,它们不相等。在Python中,当iterable的元素也是iterable时,可以在循环定义中解压它们的值,这就是第一个示例中发生的情况。
换句话说,enumerate
返回元组生成器。这些元组有两个元素:枚举对象的索引和实际值。
因为每个元组都有两个元素,所以使用for i, framenum in...
来命名元组中的每个元素是一种简单易读的方法。基本上是一样的:
for tup in enumerate(range(start, end + 1)):
i = tup[0]
framenum = tup[1]
在第二个示例中,您将在同一个iterable上迭代两次。
i
和framenum
都将始终是由enumerate
生成的元组之一,因此它绝对没有意义。再举几个例子:
iterable1 = [[1,2], [3,4]]
for i, j in iterable1:
print(i)
print(j)
在第一次迭代中,
i
将为1,j
将为2。for i in iterable1:
print(i)
i
将在第一次迭代中[1,2]
。iterable2 = [[1,2,3], [4,5,6]]
for i, j, k in iterable2:
print(i)
print(j)
print(k)
在第一次迭代中,
i
将为1,j
将为2,k
将为3。for i in iterable2:
print(i)
i
将在第一次迭代中[1,2,3]
for i,j in iterable2:
print(i)
print(j)
这将产生一个错误,因为元素(
[1,2,3]
和[4,5,6]
)不是完全由两个元素构成的。