for循环在python中不是infinate

for循环在python中不是infinate,python,Python,为什么这个for循环不是无限的,这里在一个列表上循环并在循环中重新定义列表 a = [1,2,3,4,5,6,7,8,9] for i in a: print i a = [1,2,3,4,5,6,7,8,9] output : 1,2,3,4,5,6,7,8,9 我不知道,你为什么需要这个,但这个可能会帮你 a = [1,2,3,4,5,6,7,8,9] for i in a: print i a.append(10) #or anything else-))

为什么这个for循环不是无限的,这里在一个列表上循环并在循环中重新定义列表

a = [1,2,3,4,5,6,7,8,9]
for i in a:
    print i
    a = [1,2,3,4,5,6,7,8,9]
output : 1,2,3,4,5,6,7,8,9

我不知道,你为什么需要这个,但这个可能会帮你

a = [1,2,3,4,5,6,7,8,9]
for i in a:
    print i
    a.append(10) #or anything else-))

查看代码中发生了什么

我不知道,你为什么需要这个,但这个可能会对你有帮助

a = [1,2,3,4,5,6,7,8,9]
for i in a:
    print i
    a.append(10) #or anything else-))

查看代码中发生了什么

由于未修改
a
(您只是将其设置为相同的值),因此
for
循环按预期进行。您所期望的是,当重新分配
a
时,
for
循环将重新启动,但这不会发生

相反,要使其无限大,请尝试:

a = [1,2,3,4,5,6,7,8,9]
for i in a:
    print i
    a.append(i)

由于未修改
a
(您只是将其设置为相同的值),因此
for
循环按预期进行。您所期望的是,当重新分配
a
时,
for
循环将重新启动,但这不会发生

相反,要使其无限大,请尝试:

a = [1,2,3,4,5,6,7,8,9]
for i in a:
    print i
    a.append(i)

您甚至可以不仅修改列表的内容,还可以修改变量的值,您将得到相同的结果

a = [1,2,3,4,5,6,7,8,9]
for i in a:
    print i
    a = "Hello World!"

for
中,会加载值,因此不会考虑循环内的任何修改。

您甚至可以不仅修改列表的内容,还可以修改变量的值,这样您将得到相同的结果

a = [1,2,3,4,5,6,7,8,9]
for i in a:
    print i
    a = "Hello World!"

for
中加载值,因此不会考虑循环内的任何修改。

粗略地说,循环不是无限的,因为
i
绑定到的迭代器在代码执行到达
for时被绑定。在
循环中。之后,所有后续调用都将调用
iter.next()
,这将把现有迭代器移动到下一个位置,而不考虑
a
的任何后续重新定义

回想一下,阵列有一个名为
\uuuu iter\uuuu
(或
iter
)的内置函数。然后,您的
for
循环相当于:

a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9]
it = iter(a)
try:
    while True:
        print next(it) # for compatibility you may want to use next(it)
        a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
except StopIteration:
    pass
请注意,在上面的等效代码中,
a
的任何更改都不会影响
i
,因为
i
已绑定到循环第一个
[1,2,3,4,5,6,7,8,9]
的迭代器

您可以通过更改
a的第一个值来观察这一点:

a = [ 1, 2, 3, 4 ]
for i in a:
    print i
    a = [ 5, 4, 3, 2, 1 ]

请注意,
a=[5,4,3,2,1]
不会更改第一行的
[1,2,3,4]
的存在,因为该数组已经存在于内存中。随后的每个调用都分配一个新数组并将其分配给
a

粗略地说,循环不是无限的,因为
i
绑定到的迭代器是在代码执行到达
时绑定的。在
循环中。之后,所有后续调用都将调用
iter.next()
,这将把现有迭代器移动到下一个位置,而不考虑
a
的任何后续重新定义

回想一下,阵列有一个名为
\uuuu iter\uuuu
(或
iter
)的内置函数。然后,您的
for
循环相当于:

a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9]
it = iter(a)
try:
    while True:
        print next(it) # for compatibility you may want to use next(it)
        a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
except StopIteration:
    pass
请注意,在上面的等效代码中,
a
的任何更改都不会影响
i
,因为
i
已绑定到循环第一个
[1,2,3,4,5,6,7,8,9]
的迭代器

您可以通过更改
a的第一个值来观察这一点:

a = [ 1, 2, 3, 4 ]
for i in a:
    print i
    a = [ 5, 4, 3, 2, 1 ]


请注意,
a=[5,4,3,2,1]
不会更改第一行的
[1,2,3,4]
的存在,因为该数组已经存在于内存中。随后的每个调用都分配一个新数组并将其分配给
a

无论您是否在迭代期间重新分配循环,循环都将继续。它不会回到开始…为什么在变量
a
已经启动循环后,您会期望它会对循环产生任何影响?@AndrewLi是的,您是对的,这就是它所显示的行为,但是我要对这一点做一个详细的解释。@AChampion为什么不能在python允许的情况下进行这样的实验呢?你可以,我是在问为什么你认为这会影响已经绑定的循环?例如
b=a;a=[1,2,3]
后一个赋值对
b
没有影响。无论您在迭代过程中是否重新赋值,循环都将继续。它不会回到开始…为什么在变量
a
已经启动循环后,您会期望它会对循环产生任何影响?@AndrewLi是的,您是对的,这就是它所显示的行为,但是我要对这一点做一个详细的解释。@AChampion为什么不能在python允许的情况下进行这样的实验呢?你可以,我是在问为什么你认为这会影响已经绑定的循环?例如
b=a;a=[1,2,3]
后一个赋值对
b
没有影响。改变你正在迭代的对象是个坏主意:我更喜欢
a.append(I)
,它将一些模式带到无穷远:)@AChampion,我知道它不好。事实上,它是非常没有意义的,甚至不是坏的-)@TomR当然,但当你处理荒谬的事情时,似乎没有什么是合理的-)改变你正在迭代的对象是个坏主意:我更喜欢
a.append(I)
,它带来了无限的模式:)@AChampion,我知道它是坏的。事实上,这是非常没有意义的,甚至不是坏的-)@当然,但当你处理荒谬的事情时,似乎没有什么是合理的-)我认为这个答案最能解释正在发生的事情,但我认为有一些事情比它们需要的更令人困惑。首先,我不会将For循环中的
I
值与生成它的迭代器混淆。为迭代器使用不同的名称,如
it
。我还将使用
iter
内置生成迭代器,而不是直接在列表上调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我还建议使用
next(it)
而不是
it.next()
。建造