当我尝试执行以下操作:
v = [1, 1]
for i in range(len(v)):
v.append(1)
print(v)
输出结果如下:
[1, 1, 1]
[1, 1, 1, 1]
但是当我执行以下操作时:
v = [1, 1]
for i in v:
v.append(1)
print(v)
它造成了一个无限循环。
在这两种情况下,range(len(v))
和v
的值都应该在for循环内部改变。有人能解释一下为什么这两段类似的代码会产生不同的结果吗?
当我尝试用类似的代码在R和C++中时:
对于R:
v <- c(1, 1)
for (i in v) v <- c(v, 1)
v <- c(1,1)
for (i in seq_along(v)) v<-c(v, 1)
对于C ++:
vector<int> v{1, 1};
for (auto i : v) v.push_back(1);
得到的v
是[1, 1, 1, 1]
,表明它们的行为类似于Python中的for i in range(len(v)):
。
但在C++(和Java)中:
vector<int> v{1, 1};
for (int i = 0; i < v.size(); i++) v.push_back(1);
产生了一个无限循环,表明其行为类似于Python中的for i in v:
。发生了什么?
len(n)
大小。在第二种情况下,可迭代的元素数量与之相同。由于您在每次迭代时都添加一个值,因此它是一个无限迭代器。 - yaturange(len(n))
是一个范围对象,其已被初始化为len(n)
的值。在迭代过程中,为什么范围对象需要改变呢? - Paul M.for (i in v)
的结果与Python中的不同。 - YY Lampush_back()
时,你都在调整向量的大小,因此size()
将不断增加,所以i
永远也追不上size()
。你不需要Java、Python或R就能看出这一点。 - PaulMcKenzie