Python - 在for循环中更改变量会导致不同的结果

3

当我尝试执行以下操作:

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)大小。在第二种情况下,可迭代的元素数量与之相同。由于您在每次迭代时都添加一个值,因此它是一个无限迭代器。 - yatu
1
range(len(n)) 是一个范围对象,其已被初始化为 len(n) 的值。在迭代过程中,为什么范围对象需要改变呢? - Paul M.
R语言怎么样?for (i in v)的结果与Python中的不同。 - YY Lam
你的第一个C++尝试存在未定义行为,因此可能发生任何事情。 - molbdnilo
每种编程语言都有不同的规则、不同的语法等。C++代码会导致明显的无限循环--每次调用push_back()时,你都在调整向量的大小,因此size()将不断增加,所以i永远也追不上size()。你不需要Java、Python或R就能看出这一点。 - PaulMcKenzie
不同编程语言的for循环的确切行为有参考资料吗? - YY Lam
4个回答

0

进行中

for i in var:

这意味着循环将针对var中的每个项目运行,然后在循环中您将附加项目到var,从而创建一个无限循环。

range(len(var))

然而,当循环开始时,它会重复执行var中元素的数量次数的循环,因此当将循环附加到循环运行时,它不会延长。


0

这里

v = [1, 1]
for i in range(len(v)):
    v.append(1)
    print(v)

你需要迭代一个包含[0 1]的列表。该列表是通过使用v的长度构建的,但与v无关。
在这里。
v = [1, 1]
for i in v:
    v.append(1)
    print(v)

您正在迭代v的元素。由于您在循环内附加元素到v,因此永远无法到达末尾。

关于C++和R:它们是不同的语言,因此代码看起来相似的语法做的事情可能不同。


0
v = [1, 1]
for i in v:
    v.append(1)
    print(v)

当你执行上述代码时,它意味着你正在循环遍历一个数组/列表-v,并在循环中不断添加元素-这永远不会结束。

当你使用len(v)的代码时,len(v)将被评估并分配为固定次数进行迭代。

然而,理想情况下,不应该在同一循环内混淆用于定义循环迭代次数的变量。


0
这是因为在您的for循环的每次迭代中,都会更新向量v。然后当它再次运行时,它将读取一个比上一次迭代更大的向量,这将导致无限循环,例如:
 v = [1, 1]
 for i in v:
    v.append(1)
    print(v) ## By this point you have v = [1,1,1], then let`s start the loop again
 # v = [1, 1, 1]
 for i in v: # v now has the len(v) = 3, not 2. And it keeps getting bigger and bigger, resulting in an infinite loop.
    v.append(1)
    print(v) # now v = [1,1,1,1]

最好的方法是使用range来设置迭代的限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接